用LoadLibrary和GetProcAddress函数调用dll的代码有问题

用LoadLibrary和GetProcAddress函数调用dll的代码有问题,希望高手指点(谢谢)!

楼主 wangzi163(甲骨文) 2005-04-02 14:12:01 在 VC/MFC / 进程/线程/DLL 提问

请高手指点程序有何问题,我做了一个dll文件想用显示的方式调用,就是用LoadLibrary和GetProcAddress函数实现,可是运行总是出错。  
  程序代码如下:  
  //Dll_Test.cpp   生成Dll_Test.dll  
  #include   "stdafx.h"  
  #include   "Dll_Test.h"  
  int   Max(int   a,   int   b)  
  {  
  if(a>b)  
  return   a;  
  else  
  return   b;  
  }  
  BOOL   APIENTRY   DllMain(   HANDLE   hModule,    
                                                DWORD     ul_reason_for_call,    
                                                LPVOID   lpReserved  
    )  
  {  
          switch   (ul_reason_for_call)  
  {  
  case   DLL_PROCESS_ATTACH:  
  case   DLL_THREAD_ATTACH:  
  case   DLL_THREAD_DETACH:  
  case   DLL_PROCESS_DETACH:  
  break;  
          }  
          return   TRUE;  
  }  
   
  //Test_GetMax.cpp  
  #include   "stdafx.h"  
  #include   <stdio.h>  
  #include   <afxwin.h>                    
  #include   <afxext.h>                    
  #include   <afxdisp.h>                  
  #include   <afxdtctl.h>  
  int   main(int   argc,   char*   argv[])  
  {  
  typedef   int   (CALLBACK*   LPFNDLLFUNC)(int   ,int);  
  HINSTANCE   hDLL;                
  LPFNDLLFUNC   lpfnDllFunc;          
   
  hDLL   =   LoadLibrary("Dll_Test.dll");  
  if   (hDLL   !=   NULL)  
  {  
  lpfnDllFunc   =   (LPFNDLLFUNC)GetProcAddress(hDLL,   "Max");  
  if   (!lpfnDllFunc)  
  {  
  FreeLibrary(hDLL);                
  }  
  else  
  {  
  printf("已经找到函数");  
  int   a;  
  a   =   lpfnDllFunc(1,2);  
  printf("返回直:%d",a);  
  }  
  }  
  return   0;  
  }  
  问题点数:100、回复次数:12 Top

1 楼 louifox(兰陵笑笑生) 回复于 2005-04-02 14:41:24 得分 5

注意Dll_Test.dll在哪个文件夹下。Top

2 楼 oyljerry(【勇敢的心】→ ㊣提拉米苏√㊣) 回复于 2005-04-02 15:01:31 得分 2

保证dll在工程目录下  
  出错指什么错误?Top

3 楼 legendhui(秋天的叶子) 回复于 2005-04-02 15:27:24 得分 2

看看你的dll路径是否正确Top

4 楼 wenxinfly(文心) 回复于 2005-04-02 15:36:54 得分 2

上面说得有道理  
  不过还有你的int   Max()函数是不是加上标识为导出函数的标识Top

5 楼 laiyiling(陌生人[MVP]) 回复于 2005-04-02 20:31:20 得分 50

不要callback试试  
  typedef   int(SQRTPROC)(int   ,int);  
  SQRTPROC*   lpfnDllFunc;  
  lpfnDllFunc   =   (SQRTPROC*   )GetProcAddress(hDLL,   "Max");Top

6 楼 kugou123(酷狗)(彪悍的人生,不需要解释 www.xiaozhou.net) 回复于 2005-04-02 20:36:15 得分 10

楼主最好用.def文件导出  
  避免编译器更改你的导出函数的名字。  
  另外,如果你的函数本身没有加调用约定,那么你用typedef定义函数指针的时候,也不要加。Top

7 楼 wellin() 回复于 2005-04-02 23:55:01 得分 20

typedef   int(*AAA)(int   ,int);  
  AAA   lpfnDllFunc;  
  HINSTANCE   hInst;  
  hInst   =   LoadLibrary("DemoDll.dll");  
  lpfnDllFunc   =   (AAA)GetProcAddress(hInst,   函数名);  
  lpfnDllFunc(a,b);  
  Top

8 楼 tankbattle(坦克大战) 回复于 2005-04-03 00:44:50 得分 3

用dumpbin.exe(vc里有)看看动态库导出的函数名被改成了什么。Top

9 楼 redkit(ChinaYan) 回复于 2005-04-03 12:49:00 得分 2

hDLL   =   LoadLibrary("Dll_Test.dll");  
  这句话你还是使用绝对路径吧!  
   
  Top

10 楼 sambios(雨雪逝去) 回复于 2005-04-03 15:41:04 得分 4

你以上的代码有以下几个不妥的地方:  
  1)没有说明要导出什么函数。  
  2)缺少.def文件。  
  以下是更正的文件内容:  
  dll中的函数改为以下代码:  
  extern   "C"   __declspec(dllexport)   int   __stdcall   Max(int   a,   int   b)  
  {  
      if(a>b)  
            return   a;  
      else  
            return   b;  
  }  
  //以下是test.def文件内容:  
  EXPORTS  
        Max  
  //:~  
  主函数不用修改。这样就没有问题了。  
  Top

11 楼 wangzi163(甲骨文) 回复于 2005-04-03 19:20:23 得分 0

其实我已经声明了,可是忘了写了,如下:  
  extern   "C"_declspec(dllimport)   int   Max(int   a,int   b);    
  最后原因把callback去掉就好使了,谢谢各位!Top

12 楼 robot1980(往事如风) 回复于 2005-06-06 14:47:36 得分 0

Ok

posted @ 2009-06-27 10:14  dzqabc  阅读(4942)  评论(0编辑  收藏  举报