dll 调用发生错误,又无法知道错误原因,请高手出山???

karlfixed 2009-03-02 10:01:22
我写的dll在普通的测试程序中运行很好,但是移植到目标程序就不行。
我猜想的原因是:
我的目标程序exe中原来有个对话框类ID都跟dll中的一样,后来删除了。dll中的有一些图片资源也是一样的。有可能冲突,不知道怎么办了?网上找了一些解决冲突的法子但是都不行。

请问 老鸟们 有什么可行的方法找出原因(我用一个基于对话框的测试程序有是正常的)
...全文
99 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
karlfixed 2009-03-03
  • 打赏
  • 举报
回复
高手指点一下啊,Help please.解决冲突的办法还是不行啊
HINSTANCE hInstResourceClient = AfxGetResourceHandle();
AfxSetResourceHandle(::GetModuleHandle("BSSReporter.dll"));

//调用Dll中的接口
CMyInterfaceClass test;
test.InitStateData("data\\BSStemp.BSS",101);

AfxSetResourceHandle(hInstResourceClient);

我都把dll中的对话框的资源#defien IDxxxx 后的数字改成与exe都不一样了,还是不行。(用其他exe都没问题的阿)

好心人救救我
thenshesaid 2009-03-03
  • 打赏
  • 举报
回复
我觉着跟资源没什么关系,你拿资源的时候用的是不同的hInstance

_AFX_THREAD_STATE* pState = AfxGetThreadState();
===〉定位到这里 ASSERT(!pState->m_bNeedTerm); // calling it twice?
一开始是这里断言么,看看为什么m_bNeedTerm会被设为false
karlfixed 2009-03-03
  • 打赏
  • 举报
回复
多谢两位抽空看帖,问题已经解决,大概原因还是id遗留相同。
我把Dll中的所有ID加了后缀_DLL并将ID定义到32600+就没问题了

Thanks again.
oyljerry 2009-03-03
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 hitler2008 的回复:]
高手指点一下啊,Help please.解决冲突的办法还是不行啊
HINSTANCE  hInstResourceClient  =  AfxGetResourceHandle();
AfxSetResourceHandle(::GetModuleHandle("BSSReporter.dll"));

//调用Dll中的接口
CMyInterfaceClass test;
test.InitStateData("data\\BSStemp.BSS",101);

AfxSetResourceHandle(hInstResourceClient);

我都把dll中的对话框的资源#defien IDxxxx 后的数字改成与exe都不一样了,还是不行。(用其…
[/Quote]
你还要仔细检查一下,是否目标exe中的资源彻底删除干净了等...
oyljerry 2009-03-03
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 hitler2008 的回复:]
摁,我把dll中初始化com的山了就可以了,但是又有错误,这次是不是更我使用的为图id与朱程序一样造成的?
有是断言错误,定位到
_AFXWIN_INLINE int CBitmap::GetBitmap(BITMAP* pBitMap)
==>>这 { ASSERT(m_hObject != NULL);
return ::GetObject(m_hObject, sizeof(BITMAP), pBitMap); }

还有ADO初始化可不可以来两次,我在dll中使用ado初始化了一次,在朱程序也初始化了,就是#import "C:\Program Files\C....
[/Quote]
你初始化第二次com的时候,可以查看一下返回值等hr,看是否有错误...
karlfixed 2009-03-02
  • 打赏
  • 举报
回复
摁,我把dll中初始化com的山了就可以了,但是又有错误,这次是不是更我使用的为图id与朱程序一样造成的?
有是断言错误,定位到
_AFXWIN_INLINE int CBitmap::GetBitmap(BITMAP* pBitMap)
==>>这 { ASSERT(m_hObject != NULL);
return ::GetObject(m_hObject, sizeof(BITMAP), pBitMap); }

还有ADO初始化可不可以来两次,我在dll中使用ado初始化了一次,在朱程序也初始化了,就是#import "C:\Program Files\C....
cnzdgs 2009-03-02
  • 打赏
  • 举报
回复
你先把这段英文注释看看。
karlfixed 2009-03-02
  • 打赏
  • 举报
回复
对了我调试的时候
debug assertion failed
file:oleinit.cpp
Line:54
我选择重试按钮
BOOL AFXAPI AfxOleInit()
{
_AFX_THREAD_STATE* pState = AfxGetThreadState();
===〉定位到这里 ASSERT(!pState->m_bNeedTerm); // calling it twice?
// Special case DLL context to assume that the calling app initializes OLE.
// For DLLs where this is not the case, those DLLs will need to initialize
// OLE for themselves via OleInitialize. This is done since MFC cannot provide
// automatic uninitialize for DLLs because it is not valid to shutdown OLE
// during a DLL_PROCESS_DETACH.
if (afxContextIsDLL)
{
pState->m_bNeedTerm = -1; // -1 is a special flag
return TRUE;
}

// first, initialize OLE

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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