zoukankan      html  css  js  c++  java
  • 用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

  • 相关阅读:
    查询语句
    索引的增删改成查
    pymysql模块
    mysql备份
    单表查询语法
    单表查询
    mysql增删改差
    Leetcode--1. Two Sum(easy)
    Leetcod--20. Valid Parentheses(极简洁的括号匹配)
    Leetcode-448. Find All Numbers Disappeared in an Array(solve without extra space easy)
  • 原文地址:https://www.cnblogs.com/dongzhiquan/p/1994827.html
Copyright © 2011-2022 走看看