在DLL中使用主程序的ListCtrl为何不行?
我想把主程序的ListCtrl传递到DLL的中使用,于是就传了ListCtrl的HWND过去。
可是DLL中一使用,就会出错,是类似于使用非法内存地址的错误。
DLL的函数是:extern "C" __declspec(dllexport) void __stdcall GetListCtrl(HWND ListCtrlHwnd)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState( ))
CListCtrl * tt = (CListCtrl*)ListCtrlHwnd;
tt->..... //这里,不管做什么都会出错。
}
请各位帮忙一下。谢谢了。
问题点数:100、回复次数:9Top
1 楼DrSmart(斯玛特)回复于 2005-12-04 10:21:27 得分 0
当然会出错,你还会发现在release版中就不会出错了,获取的hwnd不是这样用的Top
2 楼zxjrainbow(小笨象)回复于 2005-12-04 11:50:47 得分 0
请问,怎么样用才是正确的呢?
VC我只是初学者,谢谢了。Top
3 楼zxjrainbow(小笨象)回复于 2005-12-04 15:58:51 得分 0
up...Top
4 楼zxjrainbow(小笨象)回复于 2005-12-04 16:56:56 得分 0
再up....Top
5 楼rfa(实况狐狸)回复于 2005-12-05 15:17:18 得分 50
楼主呀,你传递的是句柄,能把它直接转成指针用吗......
要用CListCtrl的Attach方法,这样写:
{
AFX_MANAGE_STATE(AfxGetStaticModuleState( ))
CListCtrl tt;
if ( !tt.Attach(ListCtrlHwnd) )
{
// shit! Are u sure the handle type is ListCtrl ?!!
return;
}
/*
Do SoMeThInG U Wanna do !
*/
tt.Detach(); // 最后,不用的时候记得放掉人家哦~
}Top
6 楼zxjrainbow(小笨象)回复于 2005-12-05 16:09:02 得分 0
谢谢!试完给分!
Top
7 楼zxjrainbow(小笨象)回复于 2005-12-05 16:34:11 得分 0
调用函数:
void CTestDlg::OnButton2()
{
m_theCtrl = (CListCtrl*)GetDlgItem (IDC_LIST1); //这里是正确的,使用也没问题。
HINSTANCE DLLhInstance;
char NewMarsMenuName[MAX_PATH];
typedef int (WINAPI *CodeCheck)(HWND,char*,int);
memset(NewMarsMenuName,0x00,sizeof(NewMarsMenuName));
DLLhInstance=LoadLibrary("test.dll");
if(!DLLhInstance)
{ //如果找不到,
return ;
}
CodeCheck pCodeCheck=(CodeCheck)GetProcAddress(DLLhInstance,"CodeCheck");
if(pCodeCheck)
{
pCodeCheck(m_theCtrl->m_hWnd,NewMarsMenuName,1);
}
FreeLibrary(DLLhInstance);
}
//---------------------------------------------------------------------------
DLL中的函数:
extern "C" int _declspec(dllexport) __stdcall CodeCheck(HWND ListViewCtrlHwnd,
char *szFileName,int iOptionFlag)
{
//ListViewCtrlHwnd 是主程序中的ListViewCtrl的句柄。
//szFileName 是要检查的文件名。
//iOptionFlag 是检查的选项。
AFX_MANAGE_STATE(AfxGetStaticModuleState());
int nColumnCount;
CListCtrl* pListViewCtrl = NULL;
pListViewCtrl->Attach(ListViewCtrlHwnd); //这里出错了。还是出错了,为何啊!!!
if(pListViewCtrl)
{
nColumnCount = pListViewCtrl->GetHeaderCtrl()->GetItemCount();
}
pListViewCtrl->des..... ;//
return 0;
}
//---------------------------------------------------------------------------
本想先给您一半分.可是不行....Top
8 楼hpig(喜猪)回复于 2005-12-06 03:00:27 得分 50
CListCtrl* pListViewCtrl = NULL;
pListViewCtrl->Attach(ListViewCtrlHwnd); //这里出错了。还是出错了,为何啊!!!
能不出错吗!
一个空指针!
rfa写的很清楚了,你就按照人家那么写!
CListCtrl tt;
if(!tt.Attach(ListCtrlHwnd)){
//...
tt.Detach();
}
或者
CListCtrl* pListViewCtrl = new CListCtrl();
pListViewCtrl->Attach(ListViewCtrlHwnd); //这里出错了。还是出错了,为何啊!!!
if(pListViewCtrl)
{
nColumnCount = pListViewCtrl->GetHeaderCtrl()->GetItemCount();
}
pListViewCtrl->des..... ;//
pListViewCtrl->Detach();
delete pListViewCtrl;
return 0;
Top
9 楼zxjrainbow(小笨象)回复于 2005-12-06 22:28:43 得分 0
成功!
给分,是我粗枝大叶了。
谢谢两位了。
加分再给分。
谢谢。Top




