我有以下main.cpp用于创建Excel应用程序的C ++桌面应用程序(控制台或DLL):
#include "stdafx.h"
#include <comutil.h>
#include <stdio.h>
#pragma comment(lib, "comsuppw.lib")
#pragma comment(lib, "kernel32.lib")
#import \
"C:\Program Files (x86)\Microsoft Office\root\VFS\ProgramFilesCommonX86\Microsoft Shared\OFFICE16\mso.dll" \
rename("DocumentProperties", "DocumentPropertiesXL") \
rename("RGB", "RBGXL")
#import \
"C:\Program Files (x86)\Microsoft Office\root\VFS\ProgramFilesCommonX86\Microsoft Shared\VBA\VBA6\VBE6EXT.OLB"
#import "C:\Program Files (x86)\Microsoft Office\root\Office16\EXCEL.EXE" \
rename("DialogBox", "DialogBoxXL") rename("RGB", "RBGXL") \
rename("DocumentProperties", "DocumentPropertiesXL") \
rename("ReplaceText", "ReplaceTextXL") \
rename("CopyFile", "CopyFileXL") \
exclude("IFont", "IPicture") no_dual_interfaces
using namespace std;
int main()
{
Excel::_ApplicationPtr XL;
try
{
//Initialise COM interface
CoInitialize(NULL);
//Start the Excel Application
XL.CreateInstance(L"Excel.Application");
//Make the Excel Application visible
XL->Visible = true;
}
//If a communication error is thrown, catch it and complain
catch (_com_error &error)
{
cout << "COM error" << endl;
}
Sleep(2000);
return 0;
}
事实是,一旦主函数完成,新的Excel进程就会退出(由于Sleep(2000);
,我可以看到窗口2秒钟。)
我发现使用exit(1);
会阻止Excel App最终退出。但是有另一种方法将子进程与父控制台进程“分离/断开”吗?我在UNIX中找到了这个,但是在我的情况下我无法使它工作:Detach child process from parent
另外,我刚刚发现,如果创建一个DLL(不是控制台应用程序),使用exit(1);
退出Excel应用程序,该应用程序在启动新应用程序之前调用DLL的主要功能。这不是我想做的。 (甚至看起来这个过程变成了僵尸)