C - 导入和访问非托管DLL中的函数

时间:2014-08-14 02:25:18

标签: c dll static-libraries

最近,我对从非托管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(静态库)的对象创建对象,然后链接它们,听起来像只是导入一个函数需要做很多工作。是否有一些我可以使用的捷径,还是我必须坚持制作和使用静态库?

1 个答案:

答案 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前缀。

相关问题