【发布时间】:2016-08-10 15:48:54
【问题描述】:
我正在编写一个由外部程序调用并使用标准化参数列表的 DLL(MS VS13,c++):
extern "C" __declspec(dllimport) int TYPE850(double &time, double xin[], double xout[], double &t, double &dtdt, double par[], int info[], int icntrl);
例程的结果被写入 xout[] 数组,以便调用程序可以读取和处理 DLL 的结果。
现在我想向 DLL 添加一个对话框,该对话框可以在每次调用 DLL 时接受用户输入。这个想法是使用MFC。事实证明,简单地将一些 MFC 代码添加到现有的 DLL 代码中并不容易,所以我试图反过来做:我正在创建一个常规的 MFC DLL 和一个对话框资源并添加原始 DLL 代码。然后代码看起来像这样(没有包含语句):
BEGIN_MESSAGE_MAP(CType850LibApp, CWinApp)
END_MESSAGE_MAP()
CType850LibApp::CType850LibApp()
{
}
CType850LibApp theApp;
BOOL CType850LibApp::InitInstance()
{
CWinApp::InitInstance();
CSelDlg dlg;
m_pMainWnd = &dlg;
INT_PTR nResponse = dlg.DoModal();
return FALSE;
}
extern "C" __declspec(dllexport)int TYPE850(double &time,double xin[], double xout[], double &t, double &dtdt,double par[],int info[], int icntrl)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
//DLL code ...
return 1;
}
我已将对话框的实例添加到 CType850LibApp::InitInstance() 仅用于测试。可以编译代码,并且在运行主应用程序时,调用 DLL 时会出现对话框。但明显的问题是 C 函数从未被调用。这个想法是在 CType850LibApp::InitInstance() 中调用 C 函数,但这不起作用,因为函数的参数列表是未知的。
所以问题是: 1) 如何使用正确的参数列表调用 C 函数,以便将参数列表中包含的所有信息正确传输到 DLL 代码中,并将结果正确写入 xout[] 数组? 2) 一旦我可以调用 C 函数,如何在 DLL 中实例化对话框?
感谢您的帮助!
【问题讨论】:
-
从
InitInstance中取出模态对话框,放入TYPE850(...) -
没有帮助,因为从未调用过 Type850()。
-
还要确保
InitInstance正在返回TRUE。这是一个简单的函数调用。编辑您的问题以显示您的第二次尝试并显示相关的错误消息。 -
不太明白您要做什么。可执行文件应加载(静态或动态)DLL 并调用“导出”函数(在您的情况下为 TYPE850() )。在该函数中,您可以显示对话框,并调用原始 DLL 代码。在 App 对象的 InitInstance() 中执行此操作没有意义(我猜是在 DLL 加载期间调用的?)。可以使用成员变量和 DDX/DDV 功能将参数传递/检索到对话框,或者如果您不想这样做,可以将它们复制到全局变量。