これまで、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の単なるラッパーです)