4

これまで、LoadLibraryとGetProcAddressを使用してdllをロードし、具体的なオブジェクトを作成して共通のインターフェイスを返す、ある種のプラグインメカニズムがありました。これは、dllの1つをexeファイルにする必要があると判断するまでは正常に機能しました。

LoadLibraryのドキュメントには、exeにも使用できると記載されているので、試してみました。exeは、GetProcAddressとして、エラーなしでロードされます。しかし、具象オブジェクトのコンストラクターを呼び出そうとすると、アクセス違反が発生します。

exeをロードしても、使用するすべてのdllがロードされないため、これが発生すると思いました。そこで、LoadLibraryを使用してロードしようとしましたが、同じエラーが発生しました。これについて何かアドバイスはありますか?

これが私のコードです(混合C ++ / CLI):

Interface* MCFactory::LoadInstanceFromAssembly( String ^ concreteAssemblyName, String ^ param ){
    string fullPathToAssembly = "";
    fullPathToAssembly += FileSystem::GetPathToProgramDirectory();
    fullPathToAssembly += "\\" + marshal_as<string>(concreteAssemblyName);

    MODULE hDLL = AssemblyLoader::GetInstance().LoadAssembly( fullPathToAssembly ); 

    Interface* pObject = NULL;
    if (hDLL != NULL){
        t_pCreateInstanceFunction pCreateInstanceFunction =
            (t_pCreateInstanceFunction) ::GetProcAddress (hDLL, CREATE_INSTANCE_FUNCTION_NAME.c_str());

        if ( pCreateInstanceFunction != NULL ){
            //Yes, this assembly exposes the function we need
            //Invoke the function to create the object
            pObject = (*pCreateInstanceFunction)( marshal_as<string>(param) );              
        }
    }           
    return pObject;
}

(AssemblyLoader :: GetInstance()。LoadAssemblyは:: LoadLibraryの単なるラッパーです)

4

3 に答える 3

6

LoadLibraryプロセスのメイン実行可能ファイルでとを使用できGetProcAddressます。これにより、逆方向 (.exe から .dll) への動的エクスポートが可能になります。

.exe コードは再配置可能ではないため、リソース/データへのアクセスを除いて、2 番目の .exe をプロセス メモリ空間にロードすることはできません。(純粋な MSIL .exe ファイルは例外です。ファイルにはコードがなく、すべて JIT によって生成されるためです)。

基本的LoadLibraryに、.exe は次の場合にのみ役立ちます。

  • .exe はメイン プロセスの exe です。GetModuleHandle

    また

  • LOAD_LIBRARY_AS_DATAFILE国旗が使われています

于 2011-06-08T22:46:10.783 に答える
2

ベンの回答はほとんどの場合をカバーしていますが、この記事http://sandsprite.com/CodeStuff/Using_an_exe_as_a_dll.htmlは状況によっては役立つ場合があります

于 2011-09-16T08:32:27.723 に答える