0

したがって、このDLLがあり、AfxLoadLibraryを使用してメインアプリケーションから呼び出します。それはすべて正常に機能し、ロードして関数を呼び出すことができます。

奇妙な点はこれです。

私のアプリケーションが最初に使用して別のアプリケーションから起動された場合

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

その後、起動されたアプリケーションはdllをロードできなくなります。

誰もが混乱しないように小さな図。

MainApplication-> Dll(すべて正常)

Launcher-> MainApplication-> DLL(AfxLoadLibraryはERROR_NOACCESSで失敗します)

アプリケーションとdllの両方が同じディレクトリにあります。

編集:

私がなんとか得ることができたもう少しの情報。ParseCommandLineで失敗するのは、実際にはdll内のこのコードです。

 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ファイルに取り組みました。

編集:

ただし、これで解決しないのは、dllを含むexeがCoCreateInstanceを使用して起動された場合、ParseCommandLineの同じ問題が返されることです。

于 2012-10-08T09:25:09.340 に答える