最近,我对从非托管DLL文件导入特定函数感兴趣。似乎大多数语言都有一个特定的构造来执行此操作。例如,在C ++中,要从DLL导入特定函数,您可以这样做(取自http://msdn.microsoft.com/en-us/library/aa984739(v=vs.71).aspx):
#using <mscorlib.dll>
using namespace System::Runtime::InteropServices;
// for DllImportAttribute
namespace SysWin32
{
[DllImport("user32.dll", EntryPoint = "MessageBox", CharSet = Unicode)]
int MessageBox(void* hWnd, wchar_t* lpText, wchar_t* lpCaption,
unsigned int uType);
}
int main( )
{
SysWin32::MessageBox( 0, L"Hello world!", L"Greetings", 0 );
}
或者,例如,在平面汇编程序中,MessageBoxW
的相同导入可以这样做:
data import
library user32,'user32.dll'
import user32,MessageBox,'MessageBoxW'
end data
但是,我可以在我发现的纯C中使用的唯一方法就是如下所述:http://support.microsoft.com/kb/131313这涉及从创建.lib(静态库)的对象创建对象,然后链接它们,听起来像只是导入一个函数需要做很多工作。是否有一些我可以使用的捷径,还是我必须坚持制作和使用静态库?
答案 0 :(得分:1)
您链接的方法的原因是&#34;复杂&#34;是因为它允许函数在编译时链接到,并且可以像任何其他正常函数一样被调用。
通常,在链接DLL时,实际上是链接到相应的LIB库,其中包含调用实际DLL函数所需的信息。
另一种方法是使用LoadLibrary
手动加载DLL,然后使用GetProcAddress
获取各个函数的地址。然后,您可以通过返回的函数指针调用函数(在正确的强制转换之后)。这是一个例子:
typedef int WINAPI (*MESSAGEBOX_FUNC)(_In_opt_ HWND hWnd, _In_opt_ LPCTSTR lpText, _In_opt_ LPCTSTR lpCaption, _In_ UINT uType);
...
HMODULE hModule = LoadLibrary(_T("library_name_here.dll"));
MESSAGEBOX_FUNC MessageBox = (MESSAGEBOX_FUNC)GetProcAddress(hModule, "MessageBoxW");
...
MessageBox(0, L"Hello world!", L"Greetings", 0);
注意:我在调用_T
时使用了LoadLibrary
宏,但由于在GetProcAddress
上调用了MessageBoxW
,因此调用必须使用L
前缀。