miranda IM(一个即时通信软件)全由win32写成,我希望用MFC自行写一个Frame或者成为skin,将miranda原来的主界面嵌入其中。于是带来如下问题:
1、由于skin是用MFC写的,而miranda用win32写成,故考虑将skin封装成dll,由miranda的exe经修改代码后调用skin的dll,可行性已经试验成功。2、对于1中提及的skin与miranda原程序的通信,采用暴露函数传递窗体句柄的方式,但由于skin中有些代码(比如CMainFrame::OnSize())需要操作CWnd的变量,故而考虑将传进的句柄使用CWnd::Attach()操作后使用。
但发现程序执行到如下BOOL CWnd::Attach(HWND hWndNew)
{
ASSERT(m_hWnd == NULL);     // only attach once, detach on destroy
ASSERT(FromHandlePermanent(hWndNew) == NULL);
// must not already be in permanent map if (hWndNew == NULL)
return FALSE; CHandleMap* pMap = afxMapHWND(TRUE); // create map if not exist
ASSERT(pMap != NULL); pMap->SetPermanent(m_hWnd = hWndNew, this);#ifndef _AFX_NO_OCC_SUPPORT
AttachControlSite(pMap);
#endif return TRUE;
}
在ASSERT(FromHandlePermanent(hWndNew) == NULL);处不能继续,请文有没有什么好的方法?谢谢
暴露的相关函数是这样的
void SetTheWndAsChild(HWND hChild)
{
if(theApp.GetMainWnd()->IsKindOf (RUNTIME_CLASS(CMainFrame)))
{

CWnd tempwnd;
tempwnd.Attach (hChild);
}
}

解决方案 »

  1.   

    SetTheWndAsChild是skin.dll的exporting function?
    窗体句柄是属于私有进程地址空间的,在两个进程中传递,显然不能达到要求,可以试着把miranda的界面写成COM组件,然后嵌入your.exe.
      

  2.   

    传递窗体句柄后调用SetParent设置父窗体,试验成功了呀。
    刚才又用其他方法试了一下,发现attach好像不允许attach一个已经挂到Cwnd对象上的句柄。
      

  3.   

    pragma data_seg(".MYSEC")
    HWND g_hWnd = NULL;
    #pragma data_seg()   
    #pragma comment(linker, "/SECTION:.MYSEC,RWS")
      

  4.   

    回复人:DentistryDoctor(不在无聊中无奈,就在沉默中变态) ( 五星(高级)) 信誉:194  2007-01-22 17:03:28  得分:0

    如果处于不同的进程地址空间,显然是行不通的。
    ---------------
    client exe 和dll不处于相同的地址空间么?能否指点一二? 回复人:goodboyws(深夜不眠者(VCMVP)) ( 四星(高级)) 信誉:175  2007-01-22 17:01:53  得分:0

    pragma data_seg(".MYSEC")
    HWND g_hWnd = NULL;
    #pragma data_seg()
    #pragma comment(linker, "/SECTION:.MYSEC,RWS")
    ----------------
    这一段大致作用是什么?请赐教。
      

  5.   

    就是在不同的exe之间共享g_hWnd的值,这段代码加到dll里
      

  6.   

    那么dll如何利用g_hWnd来操作exe中的窗体呢?
      

  7.   

    dll里实现
    __declspec( dllexport ) void SetWindow(HWND hWnd)
    {
        g_hWnd = hWnd;
    }在exe里调用这个函数把需要处理的窗口句柄传给dll
      

  8.   

    我试验了一下,直接传递Win32窗体的句柄也是可以的,如果传递的是MFC窗体的句柄则不行。我的blog里面记录了一下。