需要写的DLL要链接到一个ActiveX控件中,这个ActiveX控件被DEPHI程序调用,
我需要在DLL中设置程序的光标,光标资源放在DLL中,原来用AfxGetApp()->LoadCursor可以在MFC的DEMO程序上跑通。
但放到DEPHI上却不行。void TTCCanvas::SetCursor(UINT resource)
{
HCURSOR hcursor = NULL;
HINSTANCE hinstance = NULL;
HINSTANCE hinstanceOld = NULL; //hcursor = AfxGetApp()->LoadCursor(resource); hinstanceOld = AfxGetResourceHandle();
hinstance = AfxFindResourceHandle(MAKEINTRESOURCE(resource),RT_CURSOR);
AfxSetResourceHandle(hinstance);
hcursor = LoadCursor(hinstance,MAKEINTRESOURCE(resource));
::SetCursor(hcursor);
AfxSetResourceHandle(hinstanceOld);
}这样也不行,
HINSTANCE hInst;
//hcursor = AfxGetApp()->LoadCursor(resource);
hInst = AfxFindResourceHandle(MAKEINTRESOURCE(resource),RT_CURSOR);
hcursor = ::LoadCursor(hInst,MAKEINTRESOURCE(resource));谢谢!!!
我需要在DLL中设置程序的光标,光标资源放在DLL中,原来用AfxGetApp()->LoadCursor可以在MFC的DEMO程序上跑通。
但放到DEPHI上却不行。void TTCCanvas::SetCursor(UINT resource)
{
HCURSOR hcursor = NULL;
HINSTANCE hinstance = NULL;
HINSTANCE hinstanceOld = NULL; //hcursor = AfxGetApp()->LoadCursor(resource); hinstanceOld = AfxGetResourceHandle();
hinstance = AfxFindResourceHandle(MAKEINTRESOURCE(resource),RT_CURSOR);
AfxSetResourceHandle(hinstance);
hcursor = LoadCursor(hinstance,MAKEINTRESOURCE(resource));
::SetCursor(hcursor);
AfxSetResourceHandle(hinstanceOld);
}这样也不行,
HINSTANCE hInst;
//hcursor = AfxGetApp()->LoadCursor(resource);
hInst = AfxFindResourceHandle(MAKEINTRESOURCE(resource),RT_CURSOR);
hcursor = ::LoadCursor(hInst,MAKEINTRESOURCE(resource));谢谢!!!
要不你改静态链接资源那种dll
要不然的话你可以试试
::AfxSetResourceHandle(::GetModuleHandle(_T("IMDIALOG.dll/*你的dll名字*/")));
/////....引用资源的代码
::AfxSetResourceHandle(::GetModuleHandle(NULL));
HINSTANCE hinstDLL,
DWORD fdwReason,
LPVOID lpvReserved
);
dll入口点记住hinstDLL 后面装载资源用void TTCCanvas::SetCursor(UINT resource)
{
HCURSOR hcursor = NULL;
hcursor = ::LoadCursor(hinstDLL,MAKEINTRESOURCE(RT_CURSOR));
::SetCursor(hcursor);
}
这个可以用,但是要是DLL文件名改变了怎么办啊
AfxSetResourceHandle(hinstance); //hinstance要是你dll的instance
要及时释放
::AfxSetResourceHandle(::GetModuleHandle(NULL));
放到函数里面会报错,、mfcs42d.lib(dllmodul.obj) : error LNK2005: _DllMain@12 already defined in TTMeas.obj
mfcs42d.lib(dllmodul.obj) : error LNK2005: __pRawDllMain already defined in TTMeas.obj
mfcs42d.lib(dllmodul.obj) : warning LNK4006: _DllMain@12 already defined in TTMeas.obj; second definition ignored
mfcs42d.lib(dllmodul.obj) : warning LNK4006: __pRawDllMain already defined in TTMeas.obj; second definition ignored
要换成,AFX_MANAGE_STATE(AfxGetAppModuleState()) ,但放到函数前面会有ASSERT错误!,好像是没设置ResourceHandle.
{
HCURSOR hcursor = NULL;
HINSTANCE hinstance = NULL;
HINSTANCE hinstanceOld = NULL; //FIXME:不能使用AfxGetApp()->LoadCursor
hcursor = ::LoadCursor(g_hInst_resource,MAKEINTRESOURCE(resource));
::SetCursor(hcursor);
}已经解决,DLL初始化的时候我保存了HINSTANCE,多谢各位!!!