我自己写了一个DLL,在DEBUG模式下调用一点问题都没有,但是编译成RELEASE的时候一调用就挂,注意不是DLL有问题,因为我详细测试过DLL肯定没有问题的。为什么主程序会挂呢??以下是调用DLL部分代码:
typedef BOOL (PROCESSPROC)(CString,CString,CString,int);
PROCESSPROC* pFunction;
VERIFY(pFunction = (PROCESSPROC*)::GetProcAddress(temp->hInstance, temp->szInterFacename));
if(!(*pFunction)(g_strMapName,g_strLayerName,g_strObjectID,g_UserLevel))
{
AfxMessageBox("DLL 运行失败!!!");
return FALSE;
}
temp是一个保存DLL信息的结构,成员变量hInstance ,szInterFacename都已经初始化,而且这段代码也能正确运行,DLL的界面也能看见,就是在看见DL界面的时候挂了。很奇怪

解决方案 »

  1.   

    你的调用代码看不出有什么问题,估计还是你的DLL中的问题,注意Debug和Release中对指针和BOOL型变量的初始默认值是不同的。最好养成对每个变量都先赋值后使用。再有一种情况是对于自定义消息的处理,有时候在Debug下是正确的,但是Release下是错误的,对于自定义消息一定要书写标准,含有两个参数。
      

  2.   

    郁闷,DLL中应该没有任何问题才对,以下是DLL运行日志:
    Begin Connect DB!//调用ConnectDB函数
    Get ServerName//获得数据库服务器名字
    Get ServerName OK//获得成功
    Begin SQL Connect DB//开始SQL连接
    Begin SQL Connect DB OK//连接成功
    DB Connect OK!!//ConnectDB函数调用成功
    Begin InitData!!//开始数据初始化
    END InitData!!//数据初始化成功
    Dialog Init OK!!!//对话框初始化完毕!!
    都在这里了,没有一个异常!!!怪了!!!
      

  3.   

    我自己写了一个DLL,在DEBUG模式下调用一点问题都没有,但是编译成RELEASE的时候一调用就挂,注意不是DLL有问题,因为我详细测试过DLL肯定没有问题的。
    ============================
    经验告诉我,不要这么自信。
    也许两个模块经过上千次试验,单独都没有问题,但这还是不能保证这两个模块链接起来的时候就一定没有错误。
    Debug版本没有问题,Release版本错误。那么你的调用程序是什么版本的呢?就是说,你的应用程序是不是Release版本的?有时候debug版本的应用程序需要debug版本的动态库,而release版本的应用程序需要release版本的动态库。这个我也碰到过。
    如果不是这个问题,那么,请多多检查Release版本与Debug版本的主要区别上的问题。如vcleaner所说的几个问题。
    自信是好事,但不要过于自信。程序是不会撒谎的。
      

  4.   

    问题是我的Dll是RELEASE版本而且有独立的测试程序,测试程序也是RELEASE版本,测试的时候一点问题都没有。
    我的应用程序也是RELEASE版本,独立运行的时候也没有问题,加载了DLL就挂了!!如果是DEBUG就没有问题!
      

  5.   

    GisClient.exe 遇到问题需要关闭。我们对此引起的不便表示抱歉。
    这个错误只说创建了一个错误日志,并询问是否发送,并没有说某个指针不能读或不能写啊!!
      

  6.   

    楼主:两个dll用的设置是use mfc in shared dll吗?
    我以前也碰见过类似问题!
      

  7.   

    我在DLL中使用了ADO连接数据库,是否::CoInitialize(NULL);初始化的问题呢??可是DLL日志中没有报错啊!!好奇怪!
    我在主程序中初始化过了,在DLL中也初始化了一次!!是不是这个问题呢??
      

  8.   

    在DLL里面不要使用任何组件相关的初始化,像
    ::CoInitialize(NULL);
    ::AfxOleInit();
      

  9.   

    to happyparrot(快乐鹦鹉),本来DLL初始化可以全部完成就是哪个运行日志可以全部写完,后来我修改了一些地方,就是将::CoInitialize(NULL);去掉了,但程序还是死了,可DLL没有全部运行,连对话框初始化都事件都没有响应,说明消息循环出了问题,可是我没有自定义任何消息!指针调用也没有问题,我给DLL传的参数都使用了全局变量!!
    to BigFanOfCpp(vc程序员) 
    如果调用你说的那些函数会有什么问题呢????
      

  10.   

    我还想问另外一个问题,在DLL中调用对话框(模式调用),对话框有消息循环吗??上面的问题基本解决了,调用的时候不再失败,解决方法,我将DLL中的::CoInitialize(NULL)去掉了,并且将非模式调用对话框改为模式调用,现在调用对话框的时候不报错了,关闭的时候却报错。奇怪!!!
      

  11.   

    郁闷啊!!说了这么多都是白费!我在DLL中调用了对话框,所以有了各种各样的错误!!!
    哎!!!!从头来过了!!!