如题。
dll:
void CCurveLinePlot::ShowDialog()
{
AFX_MANAGE_STATE(AfxGetAppModuleState());
CDialog dlg(IDD_ABOUTBOX);//(IDD_DIA_DIALOG); IDD_DLG_ABOUT
dlg.DoModal();
}
类:
class AFX_EXT_CLASS CCurveLinePlot : public CButton
{
static void ShowDialog();
}
注册dll:
BOOL CCurveLinePlot::RegisterWndClass(HINSTANCE hInstance)
{
WNDCLASS wc;
//initialize the winddow class;
memset(&wc, 0, sizeof(wc));
wc.lpszClassName ="CCurLinePlot";// 这一句的类名是用在客户程序中的
wc.hInstance = hInstance;
wc.lpfnWndProc=CurLineWndProc; //::DefWindowProc;//这一步到底应该用什么?
wc.hCursor = ::LoadCursor(NULL,IDC_ARROW); //设置鼠标的形状为系统常见的形状
wc.hIcon = 0;
wc.lpszMenuName = NULL;
wc.hbrBackground = (HBRUSH)::GetStockObject(LTGRAY_BRUSH); //设置系统画刷
wc.style = CS_GLOBALCLASS; //这一句是什么意思我至今也没搞懂 ,是照书抄的
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
return AfxRegisterClass(&wc);
}大侠帮忙啊。查了几天了,没有答案。
dll:
void CCurveLinePlot::ShowDialog()
{
AFX_MANAGE_STATE(AfxGetAppModuleState());
CDialog dlg(IDD_ABOUTBOX);//(IDD_DIA_DIALOG); IDD_DLG_ABOUT
dlg.DoModal();
}
类:
class AFX_EXT_CLASS CCurveLinePlot : public CButton
{
static void ShowDialog();
}
注册dll:
BOOL CCurveLinePlot::RegisterWndClass(HINSTANCE hInstance)
{
WNDCLASS wc;
//initialize the winddow class;
memset(&wc, 0, sizeof(wc));
wc.lpszClassName ="CCurLinePlot";// 这一句的类名是用在客户程序中的
wc.hInstance = hInstance;
wc.lpfnWndProc=CurLineWndProc; //::DefWindowProc;//这一步到底应该用什么?
wc.hCursor = ::LoadCursor(NULL,IDC_ARROW); //设置鼠标的形状为系统常见的形状
wc.hIcon = 0;
wc.lpszMenuName = NULL;
wc.hbrBackground = (HBRUSH)::GetStockObject(LTGRAY_BRUSH); //设置系统画刷
wc.style = CS_GLOBALCLASS; //这一句是什么意思我至今也没搞懂 ,是照书抄的
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
return AfxRegisterClass(&wc);
}大侠帮忙啊。查了几天了,没有答案。
用CDialog不需要注册类。
删除了,还能使,谢谢。
现在主要问题有两个:上面红色为一个。另一个就是在外部测试的时候怎么总显示测试资源里面的对话框
单作一个程序测试dll的时候怎么总显示测试资源里面的对话框,同id的dll内部的被屏蔽总是显不出来?这就是主要的目的。这里列出的代码都是dll内部的。我查了一下,注册dll应该这样写啊,我没查对?
dll中定义了一个类,要导出,class AFX_EXT_CLASS CCurveLinePlot : public CButton ,然后该类有一个成员函数: ShowDialog()。在 ShowDialog()函数中调用dll的资源,即IDD_ABOUTBOX的一个对话框资源。
测试dll的对话框程序里也有IDD_ABOUTBOX这样的一个对话框资源,此时,运行测试程序,显示出来的却是测试程序中的对话框资源,而同名的dll中的对话框资源被屏蔽。如果把dll中的这个ID改为别的不重复的ID号,则连dll的对话框或者测试程序中的对话框资源都不会显示。这是为什么?
对话框资源的问题,你可以试试在ShowDialog函数中用AfxSetResourceHandle将默认资源模块设置为DLL的句柄,函数返回时再设置为EXE的句柄。
.cpp
*****************************************************
......................
#include "CurveLinePlot.h"
..............
extern "C" __declspec(dllexport) void ShowDialog();
LRESULT CALLBACK AFX_EXPORT CurLineWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
static AFX_EXTENSION_MODULE CurveLinePlotDLL = { NULL, NULL };
extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
.......................
}
/////////////////////////////////////////////////////////////////////////////
// CCurveLinePlotCCurveLinePlot::CCurveLinePlot()
{
......................
}CCurveLinePlot::~CCurveLinePlot()
{
...........................
}
/////////////////////////////////////////////////////////////////////////////
// CCurveLinePlot message handlersextern "C" __declspec(dllexport) void ShowDialog()
{
CDialog dlg(IDD_ABOUTBOX);
dlg.DoModal();
}
*****************************************************
.h
*****************************************************
...........
#include "resource.h"//LRESULT CALLBACK AFX_EXPORT CurLineWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
class AFX_EXT_CLASS CCurveLinePlot : public CButton
{.......................
};
/////////////////////////////////////////////////////////////////////////////********************************************************************
测试dll
*(*****************************************************************
.................
extern "C" __declspec(dllimport) void ShowDialog();...............
void CDddDlg::OnButton1()
{
// TODO: Add your control notification handler code here
HINSTANCE exe_hInstance = GetModuleHandle(NULL);
HINSTANCE dll_hInstance = GetModuleHandle("CurveLinePlot.dll");//AfxGetResourceHandle();
AfxSetResourceHandle(dll_hInstance );
//CCurveLinePlot::ShowDialog();
AfxMessageBox("before DLL");
ShowDialog();// 依然有问题
AfxMessageBox("after DLL");
AfxSetResourceHandle(exe_hInstance);
AfxMessageBox("EXE");
ShowDialog();
AfxMessageBox("EXE");
}
为什么还是不行?
http://hi.baidu.com/ming111/blog/item/484e9b13dff1e5d5f6039e1b.html
里面介绍的第三种方法,这种方法里面的ShowDlg(); 函数的调用问题,我头疼了一天了。
请帮忙。谢谢。