INFO: Windows Rundll dan Rundll32 antarmuka

Terjemahan Artikel Terjemahan Artikel
ID Artikel: 164787 - Melihat produk di mana artikel ini berlaku.
Perbesar semua | Perkecil semua

Pada Halaman ini

RINGKASAN

Microsoft Windows 95, Windows 98, dan Windows Millennium Edition (Me) berisi dua program utilitas baris perintah bernama Rundll.exe dan Rundll32.exe yang memungkinkan Anda untuk memanggil fungsi yang diekspor dari DLL, 16-bit atau 32-bit. Namun, program-program Rundll dan Rundll32 tidak memungkinkan Anda untuk panggilan fungsi apapun diekspor dari setiap DLL. Sebagai contoh, Anda dapat tidak menggunakan program utilitas ini untuk memanggil Win32 API (Application Panggilan antarmuka pemrograman) diekspor dari sistem dll. Program hanya memungkinkan Anda untuk panggilan fungsi dari DLL yang secara eksplisit ditulis untuk dipanggil oleh mereka. Artikel ini memberikan rincian lebih lanjut tentang penggunaan Rundll dan Rundll32 program di bawah sistem operasi Windows yang tercantum di atas.

MIcrosoft Windows NT 4.0, Windows 2000 dan Windows XP kapal dengan hanya Rundll32. Ada tidak ada dukungan untuk Rundll (Win16 utilitas) pada platform baik.

Program utilitas Rundll dan Rundll32 pada awalnya dirancang hanya untuk penggunaan internal di Microsoft. Tetapi fungsi yang disediakan oleh mereka cukup generik bahwa mereka sekarang tersedia untuk penggunaan umum. Perhatikan bahwa Windows NT 4.0 kapal hanya dengan Rundll32 utility program dan mendukung hanya Rundll32.

INFORMASI LEBIH LANJUT

Rundll vs Rundll32

Rundll beban dan berjalan 16-bit dll, sedangkan Rundll32 beban dan berjalan 32-bit Dll. Jika Anda melewatkan salah jenis DLL Rundll atau Rundll32, mungkin gagal untuk menjalankan tanpa menunjukkan pesan kesalahan.

Baris perintah Rundll

Baris perintah untuk Rundll adalah sebagai berikut:
   RUNDLL.EXE <dllname>,<entrypoint> <optional arguments>
				
Contohnya adalah sebagai berikut:
   RUNDLL.EXE SETUPX.DLL,InstallHinfSection 132 C:\WINDOWS\INF\SHELL.INF
				
Ada 3 masalah untuk mempertimbangkan dengan hati-hati di baris perintah di atas:
  1. Rundll atau Rundll32 mencari nama-file DLL yang diberikan di tempat-tempat standar (lihat dokumentasi untuk fungsi LoadLibrary() untuk rincian). Dianjurkan bahwa Anda berikan path lengkap untuk DLL untuk memastikan bahwa benar ditemukan. Untuk hasil terbaik, menggunakan nama file pendek bukan nama file yang panjang untuk memastikan bahwa tidak ada karakter ilegal akan muncul. Catatan khususnya bahwa ini berarti DLL dalam folder "C: Program Files" harus diubah namanya pendek.
  2. <dllname>Mungkin tidak berisi spasi atau koma atau tanda kutip. Ini adalah pembatasan dalam parser baris perintah Rundll.</dllname>
  3. Dalam baris perintah di atas, koma (,) antara <dllname>dan nama fungsi <entrypont>sangat penting. Jika koma pemisah hilang, Rundll atau Rundll32 akan gagal tanpa menunjukkan kesalahan. Selain itu, tidak ada spasi putih di antara <dllname>, koma, dan <entrypoint>fungsi.</entrypoint> </dllname> </entrypont> </dllname>

Bagaimana Rundll bekerja

Rundll melakukan langkah-langkah berikut:
  1. Ini menggunakan baris perintah.
  2. Beban DLL ditentukan melalui LoadLibrary().
  3. Memperoleh alamat <entrypoint>fungsi melalui GetProcAddress().</entrypoint>
  4. It panggilan <entrypoint>fungsi, melewati ekor baris perintah yang merupakan <optional arguments="">.</optional> </entrypoint>
  5. Ketika kembali fungsi <entrypoint>, Rundll.exe unloads DLL dan keluar. </entrypoint>

Bagaimana menulis Anda DLL

Dalam DLL, menulis fungsi <entrypoint>dengan prototipe berikut: </entrypoint>

16-bit DLL:

  void FAR PASCAL __loadds
  EntryPoint(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow);
				
32-bit DLL:
  void CALLBACK
  EntryPoint(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow);
				
Sekali lagi, ada isu-isu 3 untuk mempertimbangkan dengan fungsi meluas:
  1. Jelas, nama "Meluas" harus diganti dengan nama sebenarnya dari fungsi titik entri Anda. Catatan Rundll32 catatan titik itu benar-benar tidak berhubungan fungsi DllEntryPoint dalam DLL 32-bit yang menangani proses dan benang attach/detach pemberitahuan.
  2. Fungsi titik entri untuk Rundll32 harus didefinisikan dengan _stdcall memanggil Konvensi (CALLBACK default untuk menggunakan atribut _stdcall). Jika atribut _stdcall hilang, maka fungsi default untuk _cdecl memanggil Konvensi dan kemudian Rundll32 akan mengakhiri normal setelah memanggil fungsi.
  3. Karena Anda harus menyatakan fungsi dengan _stdcall memanggil Konvensi seperti yang dijelaskan di atas, maka Visual C++ compiler akan benar-benar ekspor sebagai _EntryPoint@16 jika DLL ditulis dalam c atau akan menggunakan lebih lanjut nama dekorasi ini, jika DLL ditulis dalam c + +. Jadi, berhati-hati untuk menggunakan nama dengan benar diekspor di baris perintah untuk Rundll atau Rundll32. Jika Anda ingin menghindari menggunakan dihiasi nama, menggunakan .def file dan ekspor fungsi titik masuk dengan nama. Lihat dokumentasi produk dan artikel berikut untuk informasi lebih lanjut tentang nama dekorasi ketika menggunakan Visual C++ compiler:
    140485Mengekspor PASCAL-seperti simbol di 32-bit dll
Parameter untuk Rundll entry point adalah sebagai berikut:
   hwnd - window handle that should be used as the owner window for
          any windows your DLL creates
   hinst - your DLL's instance handle
   lpszCmdLine - ASCIIZ command line your DLL should parse
   nCmdShow - describes how your DLL's windows should be displayed
				
Dalam contoh berikut:
     RUNDLL.EXE SETUPX.DLL,InstallHinfSection 132 C:\WINDOWS\INF\SHELL.INF
				
Rundll akan memanggil fungsi meluas InstallHinfSection() Setupx.dll dan melewati parameter berikut:
   hwnd = (parent window handle)
   hinst = HINSTANCE of SETUPX.DLL
   lpszCmdLine = "132 C:\WINDOWS\INF\SHELL.INF"
   nCmdShow = (whatever the nCmdShow was passed to CreateProcess)
				
Perhatikan bahwa ini adalah fungsi <entrypoint>(atau InstallHinfSection() dalam di atas contoh) yang telah untuk mengurai sendiri baris perintah (lpszCmdLine parameter di atas) dan menggunakan parameter individu yang diperlukan. Rundll.exe mem-parsing hanya untuk argumen opsional berlalu untuk perintah yang baris. Sisa yang parsing terserah <entrypoint>fungsi. </entrypoint></entrypoint>

Catatan khusus tentang perbedaan antara Windows 95 dan Windows NT

Pada Windows NT, Windows 2000 dan Windows XP perilaku Rundll32.exe sedikit berbeda, untuk mengakomodasi UNICODE baris perintah.

Windows NT pertama kali mencoba untuk GetProcAddress untuk <entrypoint>W. Jika titik entri ini ditemukan, kemudian prototipe diasumsikan: </entrypoint>
   void CALLBACK
   EntryPointW(HWND hwnd, HINSTANCE hinst, LPWSTR lpszCmdLine,
               int nCmdShow);
				
Ini adalah sama dengan meluas ANSI, kecuali bahwa lpszCmdLine parameter sekarang adalah UNICODE string.

Jika titik <entrypoint>w entri tidak ditemukan, maka Windows NT akan GetProcAddress untuk <entrypoint>dan <entrypoint>. Jika baik ditemukan, kemudian dianggap ANSI entry point dan diperlakukan dengan cara yang sama sebagai Windows 95/98/Me. Oleh karena itu, jika Anda ingin Anda DLL untuk berjalan pada Windows 95 dengan ANSI dukungan dan pada Windows NT/2000/XP dengan dukungan UNICODE, Anda harus mengekspor dua fungsi: EntryPointW dan meluas. Pada Windows NT/2000/Me, EntryPointW fungsi akan dipanggil dengan baris perintah UNICODE; pada Windows 95/98/Me, meluas fungsi akan dipanggil dengan baris perintah ANSI. </entrypoint></entrypoint></entrypoint>

Properti

ID Artikel: 164787 - Kajian Terakhir: 15 September 2011 - Revisi: 2.0
Berlaku bagi:
  • Microsoft Win32 Application Programming Interface, ketika digunakan dengan:
    • Microsoft Windows 98 Standard Edition
    • Microsoft Windows Millennium Edition
Kata kunci: 
kbdll kbFAQ kbinfo kbkernbase kbprogramming kbusage kbmt KB164787 KbMtid
Penerjemahan Mesin
PENTING: Artikel ini diterjemahkan menggunakan perangkat lunak mesin penerjemah Microsoft dan bukan oleh seorang penerjemah. Microsoft menawarkan artikel yang diterjemahkan oleh seorang penerjemah maupun artikel yang diterjemahkan menggunakan mesin sehingga Anda akan memiliki akses ke seluruh artikel baru yang diterbitkan di Pangkalan Pengetahuan (Knowledge Base) dalam bahasa yang Anda gunakan. Namun, artikel yang diterjemahkan menggunakan mesin tidak selalu sempurna. Artikel tersebut mungkin memiliki kesalahan kosa kata, sintaksis, atau tata bahasa, hampir sama seperti orang asing yang berbicara dalam bahasa Anda. Microsoft tidak bertanggung jawab terhadap akurasi, kesalahan atau kerusakan yang disebabkan karena kesalahan penerjemahan konten atau penggunaannya oleh para pelanggan. Microsoft juga sering memperbarui perangkat lunak mesin penerjemah.
Klik disini untuk melihat versi Inggris dari artikel ini:164787

Berikan Masukan

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com