今天加载动态链接库,可以加载到库,但是里面的函数却加载不加来,用errlook工具查看错误信息是找不到指定的函数
将函数名反复看好几遍,复制。还是不行,用Depends工具看链接库的导出函数 明显看到那个函数就在那。
请教大虾原因了 下面是我的主干代码
库:
定义导出函数
HHICRes 和 HICParaml是两个结构体
__declspec (dllexport)  HICRes handleCharge(HICParaml &charge)
{

}
测试文件
typedef HICRes ( *LPFUNC)(HICParaml &send);//这个前边用不用 __stdcall有差别么 反正都找不到 默认的调用方式不就是stdcall么int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{    HINSTANCE hdll=::LoadLibrary("Control3.dll");//不会是版本问题,弄了好几次 dll和main里调用的函数名字是一样的
if(hdll!=NULL)
{
LPFUNC pf=(LPFUNC)GetProcAddress(hdll,"handleCharge");
UINT errorid=GetLastError();//错误代码 127 pf为空         }
}

解决方案 »

  1.   

    *.def文件是否写了导出函数名称?
      

  2.   

    或者你在导出函数前加上  WINAPI
      

  3.   

    在__declspec (dllexport)前加extern "C"
      

  4.   

    你这个是动态加载,加载名和导出名一定要一样。
    如果你没有使用def文件来定义导出名的话,要分两种情况:
    1:如果你导出dll的代码是.c结尾,那你加载的函数名可能会是_handleCharge
    2:如果是c++的话,这个可能就要看你使用的什么编译器了。你可以通过depends看导出的函数名到底是什么。如果你用了def文件,就一定按照def中的函数名来加载。
      

  5.   

    在__declspec (dllexport)前加extern "C"
    或者就是在def文件中写上导出的文件名
      

  6.   

    正解. 
    感觉用 def 更简单..至少代码里面看起来更好看
      

  7.   

    应该就是函数名出了问题吧
    用.def文件申明它的导出函数名
      

  8.   

    __declspec (dllexport)前加extern "C" 
    不然C++ 编译器会为了重载会修改函数名字, 比如修改成 a7adsd9@funName