C ++ / CLI: используйте LoadLibrary + GetProcAddress с exe - PullRequest
4 голосов
/ 08 июня 2011

До сих пор у меня был своего рода механизм плагинов, в котором я загружал dll, используя LoadLibrary и GetProcAddress, чтобы создать конкретный объект и вернуть общий интерфейс. Это работало нормально, пока я не решил, что один из dll должен быть 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)

Ответы [ 3 ]

6 голосов
/ 09 июня 2011

Вы можете использовать LoadLibrary и GetProcAddress в главном исполняемом файле вашего процесса, это позволяет динамический экспорт в обратном направлении (.exe в .dll).

Вы не можете загрузить второй .exe-файл в область памяти вашего процесса, за исключением доступа к ресурсам / данным, потому что .exe-код нельзя перемещать. (Чистые файлы MSIL .exe являются исключением, потому что в файле нет кода, все они генерируются JIT.)

Как правило, LoadLibrary для .exe полезно только тогда, когда

  • .exe является основным процессом exe, и в этом случае вы также можете использовать GetModuleHandle

    или

  • Используется флаг LOAD_LIBRARY_AS_DATAFILE

3 голосов
/ 11 ноября 2015

Возможно.

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

Идея состоит в том, чтобы исправить IAT, а затем вызвать CRT. Конечно, EXE должен быть перемещаемым, и по умолчанию (ASLR) это так.

2 голосов
/ 16 сентября 2011

Хотя ответ Бена охватывает большинство случаев, эта статья http://sandsprite.com/CodeStuff/Using_an_exe_as_a_dll.html может быть полезна в некоторых случаях

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...