【问题标题】:C - importing and accessing functions in unmanaged DLLsC - 在非托管 DLL 中导入和访问函数
【发布时间】:2014-08-14 02:25:18
【问题描述】:

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

【问题讨论】:

  • 注意:给定的 C++ sn-p 实际上是 VC++,因为它使用了非标准扩展。

标签: c dll static-libraries


【解决方案1】:

您链接到的方法“复杂”的原因是因为它允许在编译时链接到函数,并且可以像任何其他普通函数一样调用。

通常,在链接 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);

注意:我在调用LoadLibrary 时使用了_T 宏,但是因为GetProcAddress 是在MessageBoxW 上调用的,所以调用必须使用@ 987654330@前缀。

【讨论】:

    猜你喜欢
    • 2014-10-08
    • 1970-01-01
    • 2010-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多