我LoadLibrary已经执行成功了,而且我输入的函数名也没有错,为什么GetProcAddress会无法得到函数地址呢?
用GetLastError()返回的值是127。
即使我只是想获取向导产生的导出函数例子,也是不行.

解决方案 »

  1.   

    typedef int (FAR PASCAL *FUN)(WORD,WORD,BYTE);//参数是Init的参数HMODULE h = LoadLibrary("你的.dll");
    FUN pInit = (FUN)::GetProcAddress(h, "Init");
      

  2.   

    有可能是name mangling问题:你拿Depends打开dll,看一下库里面的导出函数名是什么如果是你自己写的dll,导出函数前加上 extern "c",避免name mangling
      

  3.   

    有可能是你在使用GetProcAddress的时候使用的函数名称和DLL中导出的函数名称不同
    你可以使用VC自带的Depends.exe工具查看你要调用的DLL中的导出函数名称,如果名称没有问题,那就是你的代码的问题了,用下面这中方式试一试
    HINSTANCE hInst = LoadLibrary("你的DLL名称(包括路径)"); 
    if(hInst) 
    {        //定义函数指针,以和你要调用的DLL中的导出函数一致
    typedef 函数返回值类型 (WINAPI *MYFUNC)(函数参数列表);          
    MYFUNC fun = NULL;
    //取得导出函数的地址,并赋值给上面定义的函数指针     
    fun=(MYFUNC)GetProcAddress(hInst, "DLL中导出函数名称");
    if(fun)
    {
    fun(函数参数);//通过函数指针来调用导出函数
    }
    FreeLibrary(hInst); //释放DLL
    }
      

  4.   

    同意zcchm(lone wolf)
    可能是函数名manling加extern "C"的作用是强制该输出函数的名称保留C语言的命名方式。这是因为,
    如果不强制的话,VC就将你的函数编译成C++的命名方式,即,在你的函数名后面加上一
    些特殊的符号。DLL输出的函数名字就不是你在代码里写的那个函数名了。当然,不加
    extern "C",仍能调用该函数,只不过,你必须先查出DLL中的真实函数名才行
    (可以用VC提供的dumpbin工具查得DLL中的输出函数名)。这件事是C++语言本身的特性,
    和你使用何种工程向导无关。此外,在现在的WIN32环境中,cdecl和stdcall的调用方
    式是完全一样的,你不用担心它们不兼容。
      

  5.   

    在工程中加一个 <工程名>.def 文件
    加入:
    EXPORTS    ; Explicit exports can go herefunc1 @1func2 @2func1、func2分别是导出函数名,依次类推
      

  6.   

    用工具看一看,用的函数名是否和DLL中导出的函数名一致,只看函数名可以这样
    命令行下 dumpbin /exports filename.dll
      

  7.   

    前提是dumpbin.exe的路径被注册为环境变量或在当前路径
      

  8.   

    zcchm(lone wolf) 说的很对
      

  9.   

    用LoadLibrary和GetProcAddress是绝对没问题的,可能是楼主在函数类型上的声明没有对。
      

  10.   

    GetLastError()返回的值如果是127的话,就是说你的DLL里面的函数不是标准的输出函数,
    要使用extern“c”。