我在dll中的函数如下
extern "C" __declspec( dllexport ) double WINAPI test(double a)
{
a++;
return a;
}
在应用程序中调用如下:
typedef double(SQRTPROC)(double); 
HINSTANCE hInstance; 
SQRTPROC* pFunction; 
VERIFY(hInstance=::LoadLibrary("dll.dll")); 
VERIFY(pFunction=(SQRTPROC*)::GetProcAddress(hInstance,"test")); 
double d=(*pFunction)(81.0);//调用该DLL函数 
为什么运行到VERIFY(pFunction=(SQRTPROC*)::GetProcAddress(hInstance,"test"));这句出错
大家帮我看看错在哪里?
 

解决方案 »

  1.   

    用Visual Studio带的一个工具 depends打开你的Dll看导出函数表,你就会发现test函数被改名了,去掉 WINAPI 的声明就可以了。
      

  2.   

    pFunction申明有问题,MSDN上有例子,你的参数没有表现出来
      

  3.   

    你的调用程序应该没有问题,估计问题还是出在DLL里面
      

  4.   

    首先 你的typedef 中 应该加 WINAPI 吧, (WINAPI 是 windows.h中定义的宏,对应的关键字 是 __stdcall, 直接写__stdcall 就可以了),因为在你的dll实现中, test 是 WINAPI (__stdcall)方式调用的。其次, typdef 似乎这样写更好,(从 pFunction 的命名方式来看)typedef double(WINAPI * SQRTPROC)(double); SQRTPROC pFunction; 
         ...
    double d=(pFunction)(81.0);//调用该DLL函数 最后, 你试着把
     pFunction=(SQRTPROC)::GetProcAddress(hInstance,"test"); 
    改为
     pFunction=(SQRTPROC)::GetProcAddress(hInstance,"_test"); 看看, 可能就行了, 因为 VC 会把 函数名前加'_'(这不是C++重命名函数名的问题,因为代码中已经extern "C"了)
    如果 一定要 VC 生成dll 的时候, 用test 的这个函数名 可以这样:
    写个 dll.def 文件 加入到工程里面去,内容为EXPORTS
    test=test