请问怎样可以完全模拟从资源管理器中打开一个word文档?
由于程序特殊的要求,需要先控制word关闭一个文档,再打开同一文档。我在关闭后使用ShellExecute或WinExec启动该文档时,会出现“某某文档正处于锁定状态”的提示,然后可以选择是否以只读方式或通知方式打开该文档。我希望是可以立即以可写方式打开该文档。而我直接在资源管理器中打开该文档时是可以的。我分析了资源管理器打开doc文件的操作,其命令行为:
"D:\Program Files\Microsoft Office\Office\WINWORD.EXE" /n
然后还有DDE选项:
DDE消息:[REM _DDE_Direct][FileOpen("%1")]
应用程序:WinWord
主题:System
我在网上找到了有关与Word进行DDE通信的代码,我想我是模拟了以上的过程,但仍会有“锁定”的提示。请问有没有知道是怎么回事的?代码如下(其中几个DDe函数为微软的support里面的,应该没有问题):
char szApp[] = "WINWORD";
char szTopic[] = "System";
char szCmd1[MAX_PATH] = {0};
sprintf(szCmd1, "[REM _DDE_Direct][FileOpen(\"%s\")]", filePath);
DWORD idInst=0;
UINT iReturn;
iReturn = DdeInitialize(&idInst, (PFNCALLBACK)DdeCallback,
APPCLASS_STANDARD | APPCMD_CLIENTONLY, 0 );
if (iReturn!=DMLERR_NO_ERROR)
{
TRACE("DDE Initialization Failed: 0x%04x\n", iReturn);
Sleep(1500);
return ;
}
//Start DDE Server and wait for it to become idle.
UINT hRet = WinExec("D:\\Program Files\\Microsoft Office\\Office\\winword.exe /n", SW_SHOWNORMAL);
if ((int)hRet < 33)
{
TRACE("Unable to Start DDE Server: 0x%04x\n", hRet);
Sleep(1500); DdeUninitialize(idInst);
return ;
}
Sleep(1000);
//DDE Connect to Server using given AppName and topic.
HSZ hszApp, hszTopic;
HCONV hConv;
hszApp = DdeCreateStringHandle(idInst, szApp, 0);
hszTopic = DdeCreateStringHandle(idInst, szTopic, 0);
hConv = DdeConnect(idInst, hszApp, hszTopic, NULL);
DdeFreeStringHandle(idInst, hszApp);
DdeFreeStringHandle(idInst, hszTopic);
if (hConv == NULL)
{
TRACE("DDE Connection Failed.\n");
Sleep(1500); DdeUninitialize(idInst);
return ;
}
//Execute commands/requests specific to the DDE Server.
DDEExecute(idInst, hConv, szCmd1);
//DDE Disconnect and Uninitialize.
DdeDisconnect(hConv);
DdeUninitialize(idInst);