gpt4 book ai didi

winapi - C++/CLI : Use LoadLibrary + GetProcAddress with an exe

转载 作者:行者123 更新时间:2023-12-04 22:36:05 30 4
gpt4 key购买 nike

到目前为止,我有某种插件机制,其中我使用 LoadLibrary 和 GetProcAddress 加载 dll 以创建一个具体对象并返回一个公共(public)接口(interface)。在我决定其中一个 dll 应该是 exe 之前,这一直很好。

LoadLibrary's documentation说它也可以用于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 的包装器)

最佳答案

您可以使用 LoadLibraryGetProcAddress在您的进程的主要可执行文件上,这允许反向动态导出(.exe 到 .dll)。

您不能将第二个 .exe 加载到您的进程内存空间中,但访问资源/数据除外,因为 .exe 代码不可重定位。 (纯 MSIL .exe 文件除外,因为文件中没有代码,都是 JIT 生成的。)

基本上,LoadLibrary在 .exe 上仅在以下情况下才有用

  • .exe是主进程exe,这种情况下不妨使用GetModuleHandle
  • LOAD_LIBRARY_AS_DATAFILE使用标志
  • 关于winapi - C++/CLI : Use LoadLibrary + GetProcAddress with an exe,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6283482/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com