我有两个.exe
个。他们需要在运行时使用彼此的功能。一个是基于dilogue的应用程序.exe
,另一个是主应用程序.exe
。现在主应用需要使用基于对话框的应用功能。但是,虽然编译它可能能够找到called function
的存在,因为dialog based applications .lib
不可用。因为如果我将基于对话框的应用程序设置为.lib
,则程序将在运行时失败。所以,我需要拨打一个.exe
给其他.exe
。
当我试着打电话时,
TestClass tc;/* Call dialog based application exe functions*/
tc.MyTest();
它会抛出像
这样的错误1>CallExe.obj : error LNK2001: unresolved external symbol "public: __thiscall TestClass::~TestClass(void)" (??1TestClass@@QAE@XZ)
1>CallExe.obj : error LNK2001: unresolved external symbol "public: void __thiscall TestClass::MyTest(void)" (?MyTest@TestClass@@QAEXXZ)
1>CallExe.obj : error LNK2001: unresolved external symbol "public: __thiscall TestClass::TestClass(void)" (??0TestClass@@QAE@XZ)
Main application.cpp
int _tmain(int argc, _TCHAR* argv[])
{
STARTUPINFO si;
PROCESS_INFORMATION pi;
TestClass tc;/* Call dialog based application exe functions*/
tc.MyTest();
// set the size of the structures
ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
ZeroMemory( &pi, sizeof(pi) );
LPCTSTR szCmdline = (LPCTSTR)(TEXT("Dialog.exe"));
// start the program up
if(!CreateProcess(TEXT("D:\\Rasmi's\\Personal\\Visual Studio\\Dialog\\Debug\\Dialog.exe"), // the path
argv[1], // Command line
NULL, // Process handle not inheritable
NULL, // Thread handle not inheritable
FALSE, // Set handle inheritance to FALSE
0, // No creation flags
NULL, // Use parent's environment block
NULL, // Use parent's starting directory
&si, // Pointer to STARTUPINFO structure
&pi ) // Pointer to PROCESS_INFORMATION structure
)
{cout << "Unable to create\n";}
// Close process and thread handles.
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
return 0;
}
在Dialog.exe
TestClass::TestClass(void)
{
}
TestClass::~TestClass(void)
{
}
void TestClass::MyTest()
{
cout << "This is my Test Class \n";
}
答案 0 :(得分:3)
您可以使用以下代码启动您的exe。
char exePath[200];
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
ZeroMemory( &pi, sizeof(pi) );
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_HIDE; //SW_SHOWDEFAULT; //Hide the DOS or Console Window
si.hStdInput;
cstring sPrjPath="D:\\Rasmi's\\Personal\\Visual Studio\\Dialog\\Debug";
sprintf(exePath,"Dialog.exe %s\", sPrjPath);
::SetCurrentDirectory(sPrjPath);
if( !CreateProcess( NULL, // No module name (use command line).
exePath, // Command line.
NULL, // Process handle not inheritable.
NULL, // Thread handle not inheritable.
FALSE, // Set handle inheritance to FALSE.
NORMAL_PRIORITY_CLASS,// No creation flags.
NULL, // Use parent's environment block.
NULL, // Use parent's starting directory.
&si, // Pointer to STARTUPINFO structure.
&pi ) // Pointer to PROCESS_INFORMATION structure.
)
{
WaitForSingleObject( pi.hProcess, INFINITE );
// Close process and thread handles.
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
return;
}
WaitForSingleObject( pi.hProcess, INFINITE );
// Close process and thread handles.
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
答案 1 :(得分:2)
正如其他人提到的,你有一个基本的设计问题。您还没有说明为什么需要两个可执行文件,但如果您确实需要两个单独的应用程序来相互交互,那么您将需要使用某种形式的interprocess communication。
如果您的两个应用程序只需要共享公共代码来显示对话框表单,但不需要彼此交互,那么您可以创建一个DLL项目来包含共享代码。然后,您的两个应用程序都将链接到此DLL。有关示例,请参阅MFC Extension DLLs。
答案 2 :(得分:1)
答案 3 :(得分:0)
最简单的方法是使用SendMessage()向基于对话框的应用程序发送WM_USER消息,并在消息循环中捕获它(使用FindWindow()来获取句柄)。如果您要传递任何参数,请考虑使用WM_COPYDATA。