如何在主程序下调用DLL,显示一非模式对话框!!?
我在dll中实现了显示模式对话框,可是改成显示非模式对话框就会出错,
下面是FaultCheck.dll中的外部函数:
extern "C" __declspec(dllexport) void Test()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
pDlg = new CDialog;
if (pDlg != NULL)
{
pDlg->Create(IDD_DIALOG1);
pDlg->ShowWindow(SW_SHOWNOACTIVATE);
}
}
exe主程序中如下调用:
void CTestDllDlg::OnButton2()
{
typedef void (FAR __cdecl *MYDLL)(void); //
HINSTANCE hinstDLL=NULL; //
hinstDLL=LoadLibrary(GetCurrentDir()+"FaultCheck.dll"); //
if (hinstDLL)
{
MYDLL proc;
proc=(MYDLL)GetProcAddress(hinstDLL,"Test");
if(proc==NULL) AfxMessageBox("can't find function");
else proc();
FreeLibrary(hinstDLL);
}
else
{
AfxMessageBox("FaultCheck.dll装载失败...");
}
}
编译运行时,DIALOG1可以显示,可是马上就windows就会报错!棘手中,请大侠赐教,分不够可再加!
我在dll中实现了显示模式对话框,可是改成显示非模式对话框就会出错,
下面是FaultCheck.dll中的外部函数:
extern "C" __declspec(dllexport) void Test()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
pDlg = new CDialog;
if (pDlg != NULL)
{
pDlg->Create(IDD_DIALOG1);
pDlg->ShowWindow(SW_SHOWNOACTIVATE);
}
}
exe主程序中如下调用:
void CTestDllDlg::OnButton2()
{
typedef void (FAR __cdecl *MYDLL)(void); //
HINSTANCE hinstDLL=NULL; //
hinstDLL=LoadLibrary(GetCurrentDir()+"FaultCheck.dll"); //
if (hinstDLL)
{
MYDLL proc;
proc=(MYDLL)GetProcAddress(hinstDLL,"Test");
if(proc==NULL) AfxMessageBox("can't find function");
else proc();
FreeLibrary(hinstDLL);
}
else
{
AfxMessageBox("FaultCheck.dll装载失败...");
}
}
编译运行时,DIALOG1可以显示,可是马上就windows就会报错!棘手中,请大侠赐教,分不够可再加!
解决方案 »
- windows程序设计,我的一些疑问
- 程序结束时,给它所应用的ocx发送什么消息?
- VC/MFC
- 【疑问】为什么程序老执行catch里的return却不返回,然后再往下执行?
- 有偿转让Java即时通信工具源程序及设计文档
- 急:在哪个网站上能找到并行通讯的英文和对应的汉语资料?
- 关于这个实例得得问题:
- listCtrl怎么设置他的颜色?
- 各位高手:DirectX8.1提供的SDK的sample中,filters的历程都链接不通过,如何解决?
- 怎么把文件存的时候在不同的分区交叉存?可以实现吗!还有:怎么做一个文件让windows无法删除
- 160分请教一个ACTIVEX调用问题。还有90分在另外一个帖子里
- 高分求串口发送文件的代码
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
pDlg = new CDialog(CWnd::FromHandle(hMainWnd));
if (pDlg != NULL)
{
pDlg->Create(IDD_DIALOG1);
pDlg->ShowWindow(SW_SHOWNOACTIVATE);
}
}
是Regular Dlls……
pDlg = new CDialog(CWnd::FromHandle(hMainWnd));
这句有问题的啊,
CDialog(const char *,class CWnd *)':cannot convert parameter 1 from 'class CWnd *' to 'const char *'
感谢支持!!!
extern "C" __declspec(dllexport) void Test(HWND hMainWnd)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
CXXXDlg pDlg(CWnd::FromHandle(hMainWnd));
pDlg = new CDialog();
if (pDlg != NULL)
{
pDlg->Create(IDD_DIALOG1);
pDlg->ShowWindow(SW_SHOWNOACTIVATE);
}
}
你的意思是要从主程序中将句柄传给dll,不过好象一般不常用这种方式,大多是在dll中自己去获取,但是这样还是出现问题,希望大侠能提供一个demo,我将开贴再送100分!
//#include "stdafx.h"
#include "TestDll.h"
#include "DlgDBConnect.h"
#include "DlgRecordset.h"
#include "DlgTableDesign.h"
#include "DlgTest.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
HWND hMainWnd;
//
// Note!
//
// If this DLL is dynamically linked against the MFC
// DLLs, any functions exported from this DLL which
// call into MFC must have the AFX_MANAGE_STATE macro
// added at the very beginning of the function.
//
// For example:
//
// extern "C" BOOL PASCAL EXPORT ExportedFunction()
// {
// AFX_MANAGE_STATE(AfxGetStaticModuleState());
// // normal function body here
// }
//
// It is very important that this macro appear in each
// function, prior to any calls into MFC. This means that
// it must appear as the first statement within the
// function, even before any object variable declarations
// as their constructors may generate calls into the MFC
// DLL.
//
// Please see MFC Technical Notes 33 and 58 for additional
// details.
///////////////////////////////////////////////////////////////////////////////
// CTestDllAppBEGIN_MESSAGE_MAP(CTestDllApp, CWinApp)
//{{AFX_MSG_MAP(CTestDllApp)
// NOTE - the ClassWizard will add and remove mapping macros here.
// DO NOT EDIT what you see in these blocks of generated code!
//}}AFX_MSG_MAP
END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////
// CTestDllApp constructionCTestDllApp::CTestDllApp()
{
// TODO: add construction code here,
// Place all significant initialization in InitInstance
}/////////////////////////////////////////////////////////////////////////////
// The one and only CTestDllApp objectCTestDllApp theApp;
BOOL bIsOpenDB(FALSE);BOOL CTestDllApp::InitInstance()
{
// TODO: Add your specialized code here and/or call the base class
/* if (!AfxOleInit())
{
AfxMessageBox("ole ³õʼ»¯´íÎó");
return FALSE;
}*/ AfxEnableControlContainer();//
return CWinApp::InitInstance();
}extern "C" __declspec(dllexport) void showDBConndlg(HWND hWndParent)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
CDlgDBConnect dlg(CWnd::FromHandle(hWndParent));
hMainWnd = hWndParent;
dlg.DoModal();
bIsOpenDB=TRUE;
}
extern "C" __declspec(dllexport) void showRecorddlg()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
CDlgRecordset dlg(CWnd::FromHandle(hMainWnd));
//hMainWnd=hWndParent;
if(bIsOpenDB)
dlg.DoModal();
else
::MessageBox(NULL,"Êý¾Ý¿âδ´ò¿ª£¬ÇëÏÈÁ¬½ÓÊý¾Ý¿â£¡","Ìáʾ",MB_OK);
}
extern "C" __declspec(dllexport) void closeconn()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// CDlgTest dlg(CWnd::FromHandle(hMainWnd));
//dlg.DoModal();
if(theApp.m_pConnection)
{
theApp.m_pConnection->Close();
theApp.m_pConnection.Release();
bIsOpenDB=FALSE;
}}
extern "C" __declspec(dllexport) void showTableDesigndlg()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
CDlgTableDesign dlg(CWnd::FromHandle(hMainWnd));
//hMainWnd=hWndParent;
if(bIsOpenDB)
dlg.DoModal();
else
::MessageBox(NULL,"Êý¾Ý¿âδ´ò¿ª£¬ÇëÏÈÁ¬½ÓÊý¾Ý¿â£¡","Ìáʾ",MB_OK);
}extern "C" __declspec(dllexport) void showTestdlg()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState()); CDlgTest dlg(AfxGetApp()->GetMainWnd());
//hMainWnd=hWndParent;
if(bIsOpenDB)
dlg.DoModal();
else
::MessageBox(NULL,"Êý¾Ý¿âδ´ò¿ª£¬ÇëÏÈÁ¬½ÓÊý¾Ý¿â£¡","Ìáʾ",MB_OK);}
非常感谢,你是对的!大意啊!给分!
to syy64(太平洋):
同样感谢你的支持,不过好象你贴出的代码是模式对话框的!对你倾力相助的精神表示感谢!!!