0

所以我有这个 DLL,我使用 AfxLoadLibrary 从我的主应用程序中调用它。一切正常,让我加载它并调用函数。

奇怪的是这个。

如果我的应用程序首先使用从另一个应用程序启动

::CreateProcess( File, CmdLine, 0, 0, FALSE, DETACHED_PROCESS, 0, 0, &StartupInfo, &ProcInfo )

然后启动的应用程序无法再加载 dll。

小图以免混淆任何人。

MainApplication -> Dll(一切正常)

启动器 -> MainApplication -> DLL(AfxLoadLibrary 因 ERROR_NOACCESS 而失败)

应用程序和 dll 都在同一个目录中。

编辑:

我设法获得的更多信息。实际上是 dll 中的这段代码在 ParseCommandLine 处失败。

 CCommandLineInfo cmdInfo;
 ParseCommandLine(cmdInfo);
 if (!ProcessShellCommand(cmdInfo))
    return FALSE;

没有这个,dll 根本不会加载,所以任何人都可以说出启动器应用程序参与后发生了什么变化。

4

1 回答 1

0

原来问题出在这一行而不是在dll中

CreateProcess( File, CmdLine, 0, 0, FALSE, DETACHED_PROCESS, 0, 0, &StartupInfo, &ProcInfo )

CmdLine 变量中可能有一个空格,并且没有被包裹在“”中。

这导致命令行在断链时无法正确通过

ParseCommandLine(cmdInfo);    

并且偶然在启动的 exe 上工作。

编辑:

但是,这并不能解决的是,如果使用 CoCreateInstance 启动带有 dll 的 exe,则 ParseCommandLine 中会返回相同的问题。

于 2012-10-08T09:25:09.340 回答