使用GetProcAddress()C ++ VBexpress 13找不到函数

时间:2014-05-21 19:20:14

标签: c++ dll loadlibrary getprocaddress

好的,所以我来这里危险地靠近转贴,但我的情况与其他许多关于这个功能的海报有点不同。我正在与一个在当天写回来的DLL接口,我所拥有的就是文件。我没有.lib文件,因此我使用了LoadLibrary和GetProcessAddress函数。我按照MSDN网站上的教程来获得基本结构。 DLL位于项目文件夹中。它汇编。在运行时,我得到了" hinstLib"的数值。所以我假设找到了DLL。我得到" ProcAdd"的空值。变量。其他海报通过将extern C放入DLL函数来解决问题,但我并不是真的有这个选择。更不用说,据我所知,这个DLL是用简单的C编写的。我确实有一个接口文档,我很确定我的函数名称是正确的(用于这些目的的通用示例替换)。老实说,我没有通过ProcAdd任务运行任何东西,因为它出现了NULL。任何想法为什么这给我一个0值的功能分配将非常感激。注意:遗憾的是由于各种原因我无法上传DLL。

    #include <iostream>
    #include "stdafx.h"
    #include "Windows.h"
    #include <stdio.h> 

    typedef int(__cdecl *MYPROC)(LPWSTR);

    using namespace std;

    int main()
    {
      HINSTANCE hinstLib;
      MYPROC ProcAdd;
      BOOL fFreeResult, fRunTimeLinkSuccess = FALSE;

      hinstLib = LoadLibrary(TEXT("dllName.dll"));
      if (hinstLib != NULL) 
    { 
    ProcAdd = (MYPROC) GetProcAddress(hinstLib, "funcName"); 

    // If the function address is valid, call the function.

    if (NULL != ProcAdd) 
    {
        fRunTimeLinkSuccess = TRUE;
        //(ProcAdd) (L"Message sent to the DLL function\n"); 
    }
    // Free the DLL module.

    fFreeResult = FreeLibrary(hinstLib); 
} 

// If unable to call the DLL function, use an alternative.
if (! fRunTimeLinkSuccess) 
    printf("Message printed from executable\n"); 

return 0;

}

1 个答案:

答案 0 :(得分:1)

编译器通常会破坏函数名称,然后名为funcName的函数可能出现在DLL中,名称为funcName@16,例如......它取决于调用约定,对函数来说很重要打得好。对于__cdecl调用约定,您可能需要_funcName :-)。