【问题标题】:How can I call a function from a dll?如何从 dll 调用函数?
【发布时间】:2010-06-10 17:24:20
【问题描述】:

如何从 DLL 调用函数?

我试图声明一个 void 指针并将 GetProcAddress 的结果存储在其中......但没有奏效。我还想声明一个unsigned long int(我在互联网上的某个地方看到过),但后来我不知道如何继续。 :D

那么,有人介意帮我一把吗?

【问题讨论】:

    标签: c++ c dll function call


    【解决方案1】:

    试试这样的。

    typedef int (*PFuncMethods)( int args );
    
    hDLL  = LoadLibrary(L"your.dll");
    if( !m_hDLL )
      return;
    
    methods = (PFuncMethods)GetProcAddress(hDLL,"methods");
    if ( !(methods) ) {
      FreeLibrary(hDLL);
      hDLL = NULL;
      methods = NULL;
      return;
    } 
    
    if( methods(1) == 0) ...
    

    方法名称也是你可能会被卡住的地方。 C++ 具有用于重载的名称修饰(即使它没有重载),这取决于编译器。您可以使用extern "C" 计算出重整名称或关闭函数的重整。您可以使用depends.exe 之类的工具来查看所有必须使用的具有确切名称的函数。

    在 windows 中使用 (import)lib 文件静态链接到 DLL 要容易得多。

    【讨论】:

    • 感谢发帖!正如我已经说过的,在之前的评论中,我添加了所有这些签名内容,并且我的代码可以正常工作。非常感谢大家。
    【解决方案2】:

    您必须创建一个函数指针而不是 void 指针,并将结果存储在来自 GetProcAddress 的函数指针中。

    【讨论】:

    • 其实是一个函数指针,指向一个void函数。对不起这是我的错。 :D
    【解决方案3】:

    您需要有准确的函数签名,并正确地转换指针。

    例如,如果这是一个接收 int 并返回 void 的函数:

    typedef void (*funcptr)(int);
    funcptr func = (funcptr)(void*)GetProcAddress(....)
    func(17);
    

    注意1:如果您混淆了签名,可能会发生非常糟糕的事情。 注意2:您还需要知道使用的调用约定(cdecl、stdcall 等)

    如果是您的 DLL,最好考虑创建一个导入库。

    【讨论】:

    • 感谢发帖!我添加了所有这些函数签名的东西,它现在可以工作了!再次感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多