C ++ / CLI:使用LoadLibrary + GetProcAddress和exe

时间:2011-06-08 18:30:34

标签: winapi c++-cli exe loadlibrary

到目前为止,我有一些插件机制,我在其中使用LoadLibrary和GetProcAddress加载dll以创建具体对象并返回一个公共接口。这工作正常,直到我决定其中一个dll应该是exe。

LoadLibrary's documentation说它也可以用于exe,所以我试了一下。作为GetProcAddress,exe加载没有错误。但是当我尝试调用我的具体对象的构造函数时,我得到了访问冲突。

我认为这会发生,因为加载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的包装器)

3 个答案:

答案 0 :(得分:6)

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

除了访问资源/数据外,您无法将第二个.exe加载到进程内存空间,因为.exe代码不可重定位。 (纯MSIL .exe文件是一个例外,因为文件中没有代码,它全部由JIT生成。)

基本上,.exe上的LoadLibrary仅在

时才有用
  • .exe是主要的进程exe,在这种情况下你也可以使用GetModuleHandle

  • 使用LOAD_LIBRARY_AS_DATAFILE标志

答案 1 :(得分:3)

有可能。

http://www.codeproject.com/Articles/1045674/Load-EXE-as-DLL-Mission-Possible

想法是修补IAT,然后调用CRT。当然,EXE必须是可重定位的,默认情况下(ASLR)它是。

答案 2 :(得分:2)

虽然Ben的答案涵盖了大多数情况,但本文http://sandsprite.com/CodeStuff/Using_an_exe_as_a_dll.html在某些情况下可能会有用