VC工程生成两个版本,release和debug,在debug版运行调用DLL函数正常,在release版调用DLL函数出来的窗口却少了一些东西!

zl_2001 2002-01-13 09:46:32
看别人的代码,DLL是一个封装好的函数库,输出一个参数设置窗口。可是在两个版本下却有不同的结果,为什么?
...全文
398 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
zl_2001 2002-01-31
  • 打赏
  • 举报
回复
测试主程序:
#include "stdafx.h"

int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
// TODO: Place code here.
typedef BOOL (WINAPI *pFUNCTION)(CWnd*);
pFUNCTION pFunction;

HINSTANCE hDll = LoadLibrary("ebdk_com.dll");

pFunction = (pFUNCTION)::GetProcAddress(hDll, "DLL_ConfigureCommPort");

if(!pFunction)
MessageBox(NULL,"failed to load dll","Test",MB_OK );
else
MessageBox(NULL,"success loading dll","Test",MB_OK );

// throw up DLL_Conf dialog to make connection
pFunction(NULL);

return 0;
}
zl_2001 2002-01-31
  • 打赏
  • 举报
回复
为什么出现这种错误,同一个dll放在别的地方,没有错误,难道是调用错误?
测试主函数如下:

#include "stdafx.h"

int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
// TODO: Place code here.
typedef BOOL (WINAPI *pFUNCTION)(CWnd*);
pFUNCTION pFunction;

HINSTANCE hDll = LoadLibrary("ebdk_com.dll");

pFunction = (pFUNCTION)::GetProcAddress(hDll, "DLL_ConfigureCommPort");

if(!pFunction)
MessageBox(NULL,"failed to load dll","Test",MB_OK );
else
MessageBox(NULL,"success loading dll","Test",MB_OK );

// throw up DLL_Conf dialog to make connection
pFunction(NULL);

return 0;
}
thd111 2002-01-31
  • 打赏
  • 举报
回复
很正常,一定是你的程序有错误!检查程序吧
zl_2001 2002-01-31
  • 打赏
  • 举报
回复
做一个测试程序,调用一个具有Dialog的对话框dll,出现Debug Assertion Failed!
经过debug发现错误点如下:但是为什么load dll资源时会出错,请高手指教!

程序中调用点pCConfigDlg.DoModal()
进入dlgcore.cpp
int CDialog::DoModal()
{
// can be constructed with a resource template or InitModalIndirect
ASSERT(m_lpszTemplateName != NULL || m_hDialogTemplate != NULL ||
m_lpDialogTemplate != NULL);

// load resource as necessary
LPCDLGTEMPLATE lpDialogTemplate = m_lpDialogTemplate;
HGLOBAL hDialogTemplate = m_hDialogTemplate;
HINSTANCE hInst = AfxGetResourceHandle();
进入afxwin1.inl
_AFXWIN_INLINE HINSTANCE AFXAPI AfxGetResourceHandle()
{ ASSERT(afxCurrentResourceHandle != NULL);
return afxCurrentResourceHandle; }
地平线 2002-01-31
  • 打赏
  • 举报
回复
是这样,程序运行时默认资源是从EXE ,到DLL,
在DLL使用资源应该在DLL初始化的时候,加入
AfxSetResourceHandle(GetModuleHandle("dllname.dll"));
如果需要设置会去,需要提前保留EXE的handle
stoneyrh 2002-01-31
  • 打赏
  • 举报
回复
go to top
zl_2001 2002-01-31
  • 打赏
  • 举报
回复
push
jzhang001 2002-01-25
  • 打赏
  • 举报
回复
我的问题与这有些类似,只在RELEASE下连编译都无法通过,居然对IMPLEMT_SERIAL()宏都要报错,DLL的CLASS的STATIC变量声明也是如此。怪胎。
乔乔公爵 2002-01-23
  • 打赏
  • 举报
回复
前面不是说了吗?
你自已也得看呀
vioy 2002-01-22
  • 打赏
  • 举报
回复
?????????????没有人理了!?
vioy 2002-01-22
  • 打赏
  • 举报
回复
?????????????没有人理了!?
vioy 2002-01-22
  • 打赏
  • 举报
回复
?????????????没有人理了!?
zl_2001 2002-01-15
  • 打赏
  • 举报
回复
大家都来讨论吧!
partime 2002-01-14
  • 打赏
  • 举报
回复
在DLL中使用MFC+Resource生成对话框调用时很容易出错.
vioy 2002-01-14
  • 打赏
  • 举报
回复
我需要UP
谁关心这个话题帮忙UP一下
vioy 2002-01-14
  • 打赏
  • 举报
回复
我需要UP
谁关心这个话题帮忙UP一下
vioy 2002-01-14
  • 打赏
  • 举报
回复
在DLL中的资源,EXE使用时,就是有可能出错!

原因:
EXE的资源中有ID号与DLL中相同,导致程序运行时,DLL要加载的资源没加载却加载了EXE中的资源,就会出现错误。但仅仅资源号相同,并不一定会出错,因为资源还有类型等等其他的东西约束。最简单,最根本(谁知道呢:>)就是把有冲突的资源号给改了。
如果只是模式对话框,可以参考《计算机编程与技术》月刊2001年8月份的,又一篇文章专门解决了这个问题。
不过我想知道,如果不是模式对话框,是其他的资源出问题了,有什么好的解决办法?
zl_2001 2002-01-14
  • 打赏
  • 举报
回复
我正是“在DLL中使用MFC+Resource生成对话框调用”啊!
乔乔公爵 2002-01-14
  • 打赏
  • 举报
回复
有一些宏是用于DEBUG调试用的,在RELEASE中根本没用。
比如ASSERT什么的,只在DEBUG中可以使用
比如VERIFY什么的,在RELEASE中使用用法就不一样了
具休的用法你可以看看MSDN
vioy 2002-01-13
  • 打赏
  • 举报
回复
u?p
加载更多回复(3)

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧