Bạn hiện đang ngoại tuyến, hãy chờ internet để kết nối lại

Thông tin: Windows Rundll và giao diện Rundll32

QUAN TRỌNG: Bài viết này được dịch bằng phần mềm dịch máy của Microsoft chứ không phải do con người dịch. Microsoft cung cấp các bài viết do con người dịch và cả các bài viết do máy dịch để bạn có thể truy cập vào tất cả các bài viết trong Cơ sở Kiến thức của chúng tôi bằng ngôn ngữ của bạn. Tuy nhiên, bài viết do máy dịch không phải lúc nào cũng hoàn hảo. Loại bài viết này có thể chứa các sai sót về từ vựng, cú pháp hoặc ngữ pháp, giống như một người nước ngoài có thể mắc sai sót khi nói ngôn ngữ của bạn. Microsoft không chịu trách nhiệm về bất kỳ sự thiếu chính xác, sai sót hoặc thiệt hại nào do việc dịch sai nội dung hoặc do hoạt động sử dụng của khách hàng gây ra. Microsoft cũng thường xuyên cập nhật phần mềm dịch máy này.

Nhấp chuột vào đây để xem bản tiếng Anh của bài viết này:164787
TÓM TẮT
Microsoft Windows 95, Windows 98 và Windows Millennium Edition (Me) chứa hai chương trình tiện ích dòng lệnh đặt tên là Rundll.exe vàRunDll32.exe cho phép bạn gọi một chức năng xuất khẩu từ một DLL,16-bit hoặc 32-bit. Tuy nhiên, các chương trình Rundll và Rundll32 thì khôngcho phép bạn gọi bất kỳ chức năng đã xuất chuyển từ bất kỳ DLL. Ví dụ, bạn có thểkhông sử dụng các chương trình tiện ích để gọi Win32 API (ứng dụngGiao diện lập trình) các cuộc gọi xuất khẩu từ hệ thống DLLs. Các chương trìnhchỉ cho phép bạn gọi chức năng từ một DLL rõ ràng bằng văn bản đểđược gọi là của họ. Bài viết này cung cấp thêm chi tiết về việc sử dụng của Rundllvà các chương trình Rundll32 dưới hệ điều hành Windows liệt kê ở trên.

MIcrosoft Windows NT 4.0, Windows 2000 và Windows XP tàu với chỉ Rundll32. Không có không có hỗ trợ cho Rundll (tiện ích Win16) trên cả hai nền tảng.

Các chương trình tiện ích Rundll và Rundll32 được thiết kế chỉ chosử dụng nội bộ tại Microsoft. Nhưng các chức năng được cung cấp bởi chúng làđủ chung và rằng họ đang có sẵn để sử dụng chung.Lưu ý rằng Windows NT 4.0 tàu chỉ với chương trình tiện ích Rundll32 vàhỗ trợ chỉ Rundll32.
THÔNG TIN THÊM

Rundll vs. Rundll32

Rundll tải và chạy 16-bit DLLs, trong khi Rundll32 tải và chạy 32-bitDll. Nếu bạn vượt qua loại sai của DLL Rundll hoặc Rundll32, nó có thểkhông chạy mà không cần chỉ ra bất kỳ thông báo lỗi.

Dòng lệnh rundll

Dòng lệnh cho Rundll là như sau:
   RUNDLL.EXE <dllname>,<entrypoint> <optional arguments>				
Một ví dụ là như sau:
   RUNDLL.EXE SETUPX.DLL,InstallHinfSection 132 C:\WINDOWS\INF\SHELL.INF				
Có 3 vấn đề cần xem xét cẩn thận ở trên dòng lệnh:
  1. Rundll hoặc Rundll32 tìm kiếm cho tên tập tin DLL nhất định ở những nơi tiêu chuẩn (xem tài liệu hướng dẫn cho các chức năng LoadLibrary() để biết chi tiết). Khuyên rằng bạn cung cấp một đường dẫn đầy đủ để DLL để đảm bảo rằng đúng được tìm thấy. Cho kết quả tốt nhất, dùng tên tệp ngắn thay vì của tên tập tin dài để đảm bảo rằng không có nhân vật bất hợp pháp sẽ xuất hiện. Lưu ý đặc biệt rằng điều này có nghĩa là một DLL trong thư mục "C: Program Files" nên được chuyển đổi sang tên ngắn của nó.
  2. <dllname> Có thể không chứa bất kỳ dấu cách hoặc dấu phẩy hoặc dấu ngoặc kép. Đây là một giới hạn trong Rundll dòng lệnh parser.</dllname>
  3. Ở trên dòng lệnh, dấu phẩy (,) giữa <dllname> và <entrypont> chức năng tên là vô cùng quan trọng. Nếu phân cách bằng dấu phẩy là mất tích, Rundll hoặc Rundll32 sẽ không thành công mà không chỉ ra bất kỳ lỗi nào. Ngoài ra, không thể có bất kỳ không gian trắng ở giữa <dllname>, dấu phẩy, và <entrypoint> chức năng.</entrypoint></dllname></entrypont></dllname>

Cách thức hoạt động Rundll

Rundll thực hiện theo các bước sau:
  1. Nó phân tích dòng lệnh.
  2. Nó tải DLL đã chỉ định thông qua LoadLibrary().
  3. Nó lấy được địa chỉ của <entrypoint> chức năng thông qua GetProcAddress().</entrypoint>
  4. Nó gọi <entrypoint> hàm, đi qua đuôi dòng lệnh là <optional arguments="">.</optional></entrypoint>
  5. Khi trở về chức năng <entrypoint> , Rundll.exe unloads DLL và thoat.</entrypoint>

Làm thế nào để viết DLL của bạn

Trong DLL của bạn, viết các chức năng <entrypoint> với chiếc nguyên mẫu sau:</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);				
Một lần nữa, có 3 vấn đề cần xem xét với chức năng EntryPoint:
  1. Rõ ràng, tên "entrypoint" nên được thay thế bằng tên của bạn điểm nhập hàm, thực tế. Lưu ý rằng mục nhập của Rundll32 chỉ là hoàn toàn không liên quan đến chức năng DllEntryPoint trong một DLL 32-bit mà quá trình xử lý và sợi đính kèm/tách thông báo.
  2. Điểm nhập hàm cho Rundll32 phải được xác định với _stdcall gọi hội nghị (gọi lại mặc định bằng cách sử dụng các thuộc tính _stdcall). Nếu các thuộc tính _stdcall là mất tích, sau đó chức năng mặc định để _cdecl gọi hội nghị và sau đó Rundll32 sẽ chấm dứt bất thường sau khi gọi chức năng.
  3. Kể từ khi bạn phải khai báo chức năng với _stdcall gọi hội nghị như mô tả ở trên, nó sau Visual C++ compiler sẽ thực sự xuất nó như _EntryPoint@16 nếu DLL được viết bằng c hoặc sẽ sử dụng thêm tên trang trí nếu DLL được viết bằng C++. Vì vậy, hãy cẩn thận để sử dụng tên chính xác đã xuất chuyển trong dòng lệnh Rundll hoặc Rundll32. Nếu bạn muốn tránh sử dụng trang trí tên, sử dụng một tập tin .def và xuất khẩu điểm nhập hàm theo tên. Xin tham khảo tài liệu sản phẩm và bài viết sau đây để biết thêm thông tin về tên trang trí khi sử dụng Visual C++ trình biên dịch:
    140485Xuất khẩu PASCAL giống như các biểu tượng trong 32-bit DLLs
Các tham số để Rundll điểm là như sau:
   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				
Trong ví dụ sau:
     RUNDLL.EXE SETUPX.DLL,InstallHinfSection 132 C:\WINDOWS\INF\SHELL.INF				
Rundll sẽ gọi hàm entrypoint InstallHinfSection()Setupx.dll và vượt qua nó các thông số sau đây:
   hwnd = (parent window handle)   hinst = HINSTANCE of SETUPX.DLL   lpszCmdLine = "132 C:\WINDOWS\INF\SHELL.INF"   nCmdShow = (whatever the nCmdShow was passed to CreateProcess)				
Ghi chú rằng chức năng <entrypoint> (hoặc InstallHinfSection() trong cácở trên ví dụ) mà đã phân tích của riêng mình dòng lệnh (lpszCmdLinetham số ở trên) và sử dụng các tham số cá nhân khi cần thiết.Rundll.exe phân tích chỉ lên đến các đối số tùy chọn thông qua để lệnh của nódòng. Phần còn lại của các phân tích là lên đến chức năng <entrypoint> .</entrypoint></entrypoint>

Ghi chú đặc biệt về sự khác biệt giữa Windows 95 và Windows NT

Trên Windows NT, Windows 2000 và Windows XP hành vi của Rundll32.exe là hơi khác nhau, để chứa UNICODE command lines.

Windows NT đầu tiên cố gắng GetProcAddress cho <entrypoint>W. Nếu thời điểm nhập cảnh này được tìm thấy, sau đó, chiếc nguyên mẫu được giả định là:</entrypoint>
   void CALLBACK   EntryPointW(HWND hwnd, HINSTANCE hinst, LPWSTR lpszCmdLine,               int nCmdShow);				
Điều này là tương tự như EntryPoint ANSI, ngoại trừ rằng lpszCmdLinetham số bây giờ là một chuỗi UNICODE.

Nếu điểm <entrypoint>w mục nhập không được tìm thấy, sau đó Windows NT sẽGetProcAddress <entrypoint>a và cho <entrypoint>. Nếu một trong hai loài này,sau đó nó được coi là một điểm nhập cảnh ANSI và được xử lý theo cách tương tự nhưWindows 95/98/Me. Vì vậy, nếu bạn muốn của bạn DLL để chạy trên Windows 95 với ANSI hỗ trợ và trên Windows NT/2000/XP với hỗ trợ UNICODE, bạn nên xuất hai chức năng: EntryPointW và EntryPoint. Trên Windows NT/2000/Me, chức năng EntryPointW sẽ được gọi là với một dòng lệnh UNICODE; trên Windows 95/98/Me, chức năng EntryPoint sẽ được gọi là với một dòng ANSI lệnh.</entrypoint></entrypoint></entrypoint>
win95 công cụ

Cảnh báo: Bài viết này được dịch tự động

Thuộc tính

ID Bài viết: 164787 - Xem lại Lần cuối: 08/19/2011 08:43:00 - Bản sửa đổi: 2.0

Microsoft Win32 Application Programming Interface

  • kbdll kbFAQ kbinfo kbkernbase kbprogramming kbusage kbmt KB164787 KbMtvi
Phản hồi