CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  进程/线程/DLL

DLL的困惑! 非常苦恼,请各位朋友帮忙看看吧,叩谢了!

楼主disque()2005-08-01 00:47:47 在 VC/MFC / 进程/线程/DLL 提问

//定义DLL.dll  
  #include   "stdafx.h"  
  #include   "cwindow.h"  
   
  int     __declspec(dllexport)   msg(int   i)  
              {   return   i+1;     }  
  BOOL   APIENTRY   DllMain(   HANDLE   hModule,    
                                                DWORD     ul_reason_for_call,    
                                                LPVOID   lpReserved   )  
  {     switch(ul_reason_for_call)  
            {  
  case   DLL_PROCESS_ATTACH:  
  {     break   ;   }  
  case   DLL_PROCESS_DETACH:  
  {     break   ;   }  
  }  
          return   TRUE;  
  }  
   
   
  //调用函数  
  //   在CTestdllDlg头文件中定义  
  //typedef     int     (*Func)(int);       //定义:方式1  
  typedef   int     __declspec(dllexport)   (*Func)(int);     //定义:方式2  
  Func   pdll;  
   
  //CTestdllDlg实现文件代码如下  
  //问题描述:可以成功打开DLL.dll,   但是运行到“j=(pdll)(10);   ”便出错,  
  //尝试采用方式1定义函数也出错  
  void   CTestdllDlg::OnButton1()    
  {  
  //   TODO:   Add   your   control   notification   handler   code   here  
  HINSTANCE   hModule=::LoadLibrary("DLL.dll");  
  if(NULL==hModule)  
  {  
  MessageBox("LoadLibrary   failed");    
  }  
  else  
  {  
        MessageBox("动态连接库成功打开...","LoadLibrary",MB_OK);  
        Func   pdll;  
        pdll=(Func)GetProcAddress(hModule,"msg");  
       
        CString   str="";  
        int   j=2;  
        j=(pdll)(10);     //程序运行到此处即报错误提示  
        str.Format("%d",j);  
        MessageBox(str);  
   
        FreeLibrary(hModule);  
  }  
   
  }  
  问题点数:50、回复次数:5Top

1 楼disque()回复于 2005-08-01 00:50:22 得分 0

抱歉,头文件中多了一句   “Func   pdll”Top

2 楼Microsnow(冰火)回复于 2005-08-01 08:26:38 得分 50

具体的错误提示是什么?  
  应该先排除你调用上的错误,然后再去其它方面去查找原因.Top

3 楼Microsnow(冰火)回复于 2005-08-01 08:58:23 得分 0

我在VS   .net   2003+Windows   2000   Professional(SP4):  
   
  DLL部分:  
  ******************************************  
  //test.h  
  #ifndef   __TEST_H  
  #define   __TEST_H  
   
  #ifdef   __cplusplus  
  extern   "C"  
  {  
  #endif  
   
  __declspec(dllexport)   int   msg(int   i);  
   
   
  #ifdef   __cplusplus  
  }  
  #endif  
   
   
  #endif  
  ============================================================  
  //test.cpp  
  //   test.cpp   :   定义   DLL   的初始化例程。  
  //  
   
  #include   "stdafx.h"  
  #include   <afxdllx.h>  
   
  #include   "test.h"   //include   local   file  
   
  #ifdef   _DEBUG  
  #define   new   DEBUG_NEW  
  #endif  
   
  static   AFX_EXTENSION_MODULE   testDLL   =   {   NULL,   NULL   };  
   
  extern   "C"   int   APIENTRY  
  DllMain(HINSTANCE   hInstance,   DWORD   dwReason,   LPVOID   lpReserved)  
  {  
  //   如果使用   lpReserved,请将此移除  
  UNREFERENCED_PARAMETER(lpReserved);  
   
  if   (dwReason   ==   DLL_PROCESS_ATTACH)  
  {  
  TRACE0("test.DLL   正在初始化!\n");  
   
  //   扩展   DLL   一次性初始化  
  if   (!AfxInitExtensionModule(testDLL,   hInstance))  
  return   0;  
   
  //   将此   DLL   插入到资源链中  
  //   注意:   如果此扩展   DLL   由  
  //     MFC   规则   DLL(如   ActiveX   控件)隐式链接到  
  //     而不是由   MFC   应用程序链接到,则需要  
  //     将此行从   DllMain   中移除并将其放置在一个  
  //     从此扩展   DLL   导出的单独的函数中。使用此扩展   DLL   的  
  //     规则   DLL   然后应显式  
  //     调用该函数以初始化此扩展   DLL。否则,  
  //     CDynLinkLibrary   对象不会附加到  
  //     规则   DLL   的资源链,并将导致严重的  
  //     问题。  
   
  new   CDynLinkLibrary(testDLL);  
   
  }  
  else   if   (dwReason   ==   DLL_PROCESS_DETACH)  
  {  
  TRACE0("test.DLL   正在终止!\n");  
   
  //   在调用析构函数之前终止该库  
  AfxTermExtensionModule(testDLL);  
  }  
  return   1;       //   确定  
  }  
   
   
  extern   "C"   __declspec(dllexport)   int   msg(int   i)  
  {  
  return   i+1;  
  }  
   
  ****************************************************  
   
  MFC应用程序(调用DLL):  
  ......  
  #include   "test.h"     //include   file   for   DLL   calling  
  ......  
  ......  
  void   CTestDLLDlg::OnBnClickedTestdll()  
  {  
  //   TODO:   在此添加控件通知处理程序代码  
          typedef   int   (*MSGType)(int   i);   //define   a   funcion   pointer  
  HINSTANCE   hModule   =   LoadLibrary(_T("test.dll"));  
  if   (NULL   ==   hModule)  
  {  
  ::MessageBox(NULL,   _T("Load   library   failed"),   _T("Test   DLL"),   MB_OK);  
  return;  
  }  
   
  MSGType   msg   =   (MSGType)GetProcAddress(hModule,   _T("msg"));  
  if   (NULL   !=   msg)  
  {  
  CString   str   =   "";  
  int   j   =   0;  
  j   =   msg(20);  
  str.Format("%d",   j);  
  MessageBox(str);  
  }  
   
  FreeLibrary(hModule);  
  }  
  ......  
  当然记得要将test.dll文件拷贝到相应的目录下面.  
  没有问题吧!  
  Top

4 楼Microsnow(冰火)回复于 2005-08-01 09:01:49 得分 0

注意,以上我用"MFC扩展DLL"Top

5 楼disque()回复于 2005-08-02 00:17:48 得分 0

多谢   Microsnow(冰火),可以了,  
  发现是DLL文件中少了   extern   "C"   ,应该是供外部引用的吧?  
  extern   "C"   __declspec(dllexport)   int   msg(int   i)Top

相关问题

  • <求助> dll的困惑
  • 动态调用DLL的困惑!
  • 动态调用DLL的困惑
  • ActiveX dll 的高级应用!!! 苦恼苦恼!! 各位帮帮忙,看一下!!
  • 调试过DLL的兄弟们请进!苦恼死我了
  • ADO和dll的问题,很困惑,请指教
  • 困惑......困惑......
  • 求Eclipse的源代码!!叩谢!!!
  • 求Eclipse的源代码!!叩谢!!!
  • 困惑

关键词

  • 函数
  • 扩展
  • dll
  • 文件
  • mfc
  • pdll
  • ctestdlldlg
  • hmodule
  • 调用
  • 初始化

得分解答快速导航

  • 帖主:disque
  • Microsnow

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo