如何在使用 OLE 自动化服务器时设置当前目录
Posted
技术标签:
【中文标题】如何在使用 OLE 自动化服务器时设置当前目录【英文标题】:How to set current directory while working with an OLE Automation Server 【发布时间】:2013-07-18 06:20:22 【问题描述】:我试图通过CreateDispatch
调用简单地创建一个 OLE EXE 服务器的实例,但显然它失败了,因为我的当前目录不正确。我得到的错误是“服务器初始化失败”。我调试了CreateDispatch
代码,发现它做了三件事。
-
CoCreateInstance //在我的例子中成功
OleRun //这在我的情况下失败并出现错误“服务器执行失败”
IDispatch 的查询接口
我也尝试通过 CreateProcess
启动该过程,但如果我在其第 8 个参数中未提供正确的 CurrentDirectory
则失败,这显然意味着在我的情况下 CurrentDirectory
不正确,我有提供它以使其正常工作。
我知道父母的CurrentDirectory
在父母试图产生一个进程时被传递。因此,我尝试通过SetCurrentDirectory
API 调用将父级的CurrentDirectory
更改为适当的目录。这在 CreateProcess
的情况下有效,但在 CreateDispatch
给我相同的错误并且在内部相同的 OleRun
调用失败的情况下不起作用。
有人知道如何将 CurrentDirectory 传递给 CreateDispatch
吗?或者有什么解决办法?
【问题讨论】:
【参考方案1】:如果您确实需要将当前目录设置为您的应用程序目录,那么您应该在您的程序的“主要”中执行此操作。您可以使用GetModuleFileName
执行此操作,然后使用splitpath
获取目录并调用SetCurrentDirectory
。
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
int _tmain()
TCHAR szDrive[_MAX_DRIVE];
TCHAR szPath[_MAX_PATH];
TCHAR szName[_MAX_FNAME];
TCHAR szExt[_MAX_EXT];
TCHAR szModName[MAX_PATH];
GetModuleFileName(NULL, szModName, MAX_PATH);
_tsplitpath(szModName, szDrive, szPath, szName, szExt);
TCHAR szAppDir[MAX_PATH];
_tcscpy_s(szAppDir, szDrive);
_tcscat_s(szAppDir, szPath);
SetCurrentDirectory(szAppDir);
_tprintf(szAppDir);
【讨论】:
以上是关于如何在使用 OLE 自动化服务器时设置当前目录的主要内容,如果未能解决你的问题,请参考以下文章
选择目录,选择文件夹的COM组件问题。在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式。请确保您的 Main 函数带有 STAThreadAttribute 标记。 只有将调试器
如何在 Delphi 的 OLE 自动化过程中使 Word 不可见
在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式,请确保您的Main函数带有STAThreadAttribute标记。 多线程操作剪切板的时候。