在一个regual的dll工程中添加了一个对话框的类
这个dll的导出函数如下:extern "C" __declspec(dllexport) int Show()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
CVerison *ver = new CVerison; //CVerison是自己在dll工程中加的类
ver->Create(IDD_DIALOG1,NULL); ver->ShowWindow(SW_SHOW);
return 1;
}现在是在别的工程中加载这个dll后调用show函数时,不能显示对话框并导致程序的关闭。
这个dll的导出函数如下:extern "C" __declspec(dllexport) int Show()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
CVerison *ver = new CVerison; //CVerison是自己在dll工程中加的类
ver->Create(IDD_DIALOG1,NULL); ver->ShowWindow(SW_SHOW);
return 1;
}现在是在别的工程中加载这个dll后调用show函数时,不能显示对话框并导致程序的关闭。
用AfxSetResourceHandle:
======================================
AfxSetResourceHandle
This function sets the HINSTANCE handle that determines where the default resources of the application are loaded.void AfxSetResourceHandle(
HINSTANCE hInstResource );
Parameters
hInstResource
Specifies the instance or module handle to an .EXE or DLL file from which the application’s resources are loaded. ==============================================
如果不做设置,程序会试图在exe中搜索资源,而不是在dll中搜索资源。
显示完对话框,在将资源句柄设回原址
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());CVerison *ver = new CVerison(CWnd::FromHandle(hMainWnd)); //CVerison是自己在dll工程中加的类
ver->Create(IDD_DIALOG1,NULL);ver->ShowWindow(SW_SHOW);
return 1;
}
{
// TODO: Add extra validation here
typedef int(*Co)(HWND hwnd);
HINSTANCE hinstDLL=NULL;
hinstDLL=LoadLibrary("VersionCtrl.dll");
if(hinstDLL)
{
Co p;
p=(Co)GetProcAddress(hinstDLL,"ShowDlg");
p(AfxGetApp()->m_pMainWnd->m_hWnd);
DWORD err = ::GetLastError();
if (::GetLastError() == NO_ERROR)
::SetLastError(err);
}
else
MessageBox("系统需要调用的DLL 文件不存在!");
if(hinstDLL)
FreeLibrary(hinstDLL);
// CDialog::OnOK();
}
多谢帮帮忙啊!!
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());CVerison *ver = new CVerison; //CVerison是自己在dll工程中加的类
ver->Create(IDD_DIALOG1,CWnd::FromHandle(hMainWnd));ver->ShowWindow(SW_SHOW);
return 1;
}
extern "C" __declspec(dllexport) int Show(HWND hMainWnd)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());CVerison ver;
ver.domodal();
return 1;
}
这样是没问题的,但是如果跟踪一下的话会发现ver的指针为空,居然也能够条用domoal函数???如果在上面那个函数中加上这么一句ver.m_Email.SetWindowText(email);//m_Email为类的一个button马上就会有一个断言错误说ver的指针是空的。真是好奇怪啊!!那位大牛给解释一下撒啊!
如果有的话你试试在InitInstance()函数中加入这一句代码
AfxInitRichEdit();
我以前也碰到过
p(AfxGetApp()->m_pMainWnd->m_hWnd);
-------------------------------------------------------
你这两行有问题:
1.你dll导出的函数名是"show",而你要找的函数却是"showdlg"
2.使用p之前要判断p是否为空还有你连CDialog::OnOK()都注释掉了,即使你的那个什么对话框显示出来,你的主程序也无法退出