Я бы хотел использовать Windows API's PatchAPI, чтобы применить некоторые исправления. Применение патчей реализовано в файле mspatcha.dll, который должен находиться в папке system32.Ссылка на Windows API PatchAPI
После прочтения в различных местах, таких как их ref и googling, мне еще предстоит найти правильный путь для ссылки на эту DLL. Я хотел бы связать статически, имея дело с LoadLibrary, кажется беспорядочным и своего рода поражением цель их заголовок patchapi.h. Так как я не нашел файл .lib я подключиться, я создал свой собственный, используя следующие команды:
1) Dumpbin/экспорт C: \ Windows \ system32 \ mspatcha.dll
2) Создать mspatcha.def файл, написать строку «экспортирует», а затем на одну строку для каждого имени функции, которая появляется на выходе DUMPBIN
3) Lib /def:mspatcha.def /out:mspatcha.lib
Хотя я уверен, что это неправильный способ статической связи с patchapi, я не нашел правильный способ сделать это. В любом случае, после выполнения этих шагов и написания простой тестовой записи, сделанной из одного вызова ApplyPatchToFileExA(), я по-прежнему получаю ошибку компоновщика на символе _ApplyPatchToFileA @ 16. Взглянув на экспортируемые символы моего вновь созданного mspatcha.lib, оказывается, что функции используют неправильное имя конвенции
D: \ TMP \ mspatcha> DUMPBIN/экспорт mspatcha.lib | найти «ApplyPatchToFileExA»
_ApplyPatchToFileExA
Если я не ошибаюсь, это указывает на то, что Lib экспортируемые функции с использованием Cdecl а длл использует STDCALL (или, по крайней мере декларирует функцию как _stdcall). См.: C name decoration in Microsoft Windows.
Мои вопросы: что такое правильный способ использования mspatcha.dll в моем приложении и что было не так с моим процессом создания lib из dll, чтобы я мог делать статические ссылки?
Подробный вывод моего терминала можно найти здесь: http://pastebin.com/q4FV4Se6
Пожалуйста, разделите термины «статически импортированные» и «статически связанные». Первое означает, что загрузчик будет разрешать любые импортированные функции до того, как двоичный элемент получит контроль (он может выйти из строя). Последнее означает, что фактический объектный код связан с вашим окончательным двоичным изображением. – 0xC0000022L
Я немного смущен тем, что 'lib.exe' должен создавать декорированные имена, подобные этому из файла DEF, который вы даете. Вы пытались связать это.lib, а затем проверить каталог импорта полученного двоичного файла? – 0xC0000022L
Попробуйте использовать этот маленький инструмент: http://vortex.masmcode.com/files/def2lib11.zip - он принимает оформленное имя в файлах .def, чтобы и компоновщик, и загрузчик были довольны. – 0xC0000022L