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、由于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);
}
}
解决方案 »
- vs08,OutputBar中显示用户操作日志,请问怎么实现?
- gsoap https 问题?
- 老师的一个项目,现在想用vc在从另一个商业软件的波形图中读取测量值,谢谢~
- 在VS中怎样有 VC6.0中ClassWizard中AutoMation增加属性的方法---Add Property?
- 有个问题,怎么样能够把Directsound处理过以后的声音不输出到声卡而直接输出到文件呢?
- listCtrl问题
- 如何备份outlook里的邮件?(请斑竹保留一天,急)
- MFC中list control控件里可以画曲线来描述实际数据吗?
- CS1.3 是不是就是winCVS 1.3啊,谢谢!
- 看过本质论的朋友,给我解释一下啥叫“类存储”好吗? 它是个什么东西?
- 如何将WORD转换为char
- 用CAsyncSocket创建UDP的socket,收到数据后,怎么得知客户的IP和端口号?
窗体句柄是属于私有进程地址空间的,在两个进程中传递,显然不能达到要求,可以试着把miranda的界面写成COM组件,然后嵌入your.exe.
刚才又用其他方法试了一下,发现attach好像不允许attach一个已经挂到Cwnd对象上的句柄。
HWND g_hWnd = NULL;
#pragma data_seg()
#pragma comment(linker, "/SECTION:.MYSEC,RWS")
?
如果处于不同的进程地址空间,显然是行不通的。
---------------
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")
----------------
这一段大致作用是什么?请赐教。
__declspec( dllexport ) void SetWindow(HWND hWnd)
{
g_hWnd = hWnd;
}在exe里调用这个函数把需要处理的窗口句柄传给dll