如何在使用 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 时如何绕过 MS Access 启动?

如何使用 OLE 自动化关闭 Word 文档?

如何利用svn自动同步更新到网站服务器

在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式,请确保您的Main函数带有STAThreadAttribute标记。 多线程操作剪切板的时候。