我写的dll在普通的测试程序中运行很好,但是移植到目标程序就不行。
我猜想的原因是:
我的目标程序exe中原来有个对话框类ID都跟dll中的一样,后来删除了。dll中的有一些图片资源也是一样的。有可能冲突,不知道怎么办了?网上找了一些解决冲突的法子但是都不行。请问 老鸟们 有什么可行的方法找出原因(我用一个基于对话框的测试程序有是正常的)

解决方案 »

  1.   

    对了我调试的时候
    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
      

  2.   

    摁,我把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....
      

  3.   

    高手指点一下啊,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都没问题的阿)好心人救救我
      

  4.   

    你初始化第二次com的时候,可以查看一下返回值等hr,看是否有错误...
      

  5.   

    你还要仔细检查一下,是否目标exe中的资源彻底删除干净了等...
      

  6.   

    多谢两位抽空看帖,问题已经解决,大概原因还是id遗留相同。
    我把Dll中的所有ID加了后缀_DLL并将ID定义到32600+就没问题了Thanks again.
      

  7.   

    我觉着跟资源没什么关系,你拿资源的时候用的是不同的hInstance_AFX_THREAD_STATE* pState = AfxGetThreadState(); 
    ===〉定位到这里 ASSERT(!pState->m_bNeedTerm);    // calling it twice? 
    一开始是这里断言么,看看为什么m_bNeedTerm会被设为false