Программно сгенерировать C Win32 DLL - PullRequest
3 голосов
/ 09 мая 2009

Мне нужно многократно генерировать Win32 DLL с функцией регистрации информации. Эта функция использует литералы для возврата информации о регистрации конкретного клиента, при этом для каждого клиента создается отдельная DLL.

У меня есть тестовая версия, работающая правильно, с жестко закодированной информацией для одного клиента. Срочность для некоторых сайтов требует, чтобы я генерировал некоторые DLL вручную, но я хотел бы дать клиенту приложение, которое динамически генерирует источник C и создает DLL по требованию.

Каков наилучший способ сделать это? У меня VS 2008 C ++ Express и, следовательно, компилятор cl.exe. Мой нынешний подход заключается в том, чтобы просто иметь приложение C # со строковой константой для источника C, и перед генерацией заменить токены в нем на требуемые параметры, а затем создать и связать, выполнив оболочку и запустив cl.exe.

Ответы [ 5 ]

5 голосов
/ 25 мая 2009

Поместить всю информацию о клиентах в виде строковых ресурсов в файл .rc. Свяжите соответствующий файл .res в свою DLL. Весь код в DLL, который зависит от этой информации о клиенте, будет вызывать LoadString для получения этого.

Затем создайте отдельную программу (или функцию) под названием «UpdateDLL.exe», которая использует API-интерфейсы Win32: BeginUpdateResource, UpdateResource и т. Д. ... для обновления DLL новой информацией.

Отправьте следующее:

  1. Предварительно скомпилированная DLL с пустыми (или по умолчанию) строками для информации о клиенте в ресурсах.

  2. Ваш инструмент UpdateDLL.exe, который принимает имя DLL и файл информации о клиенте в качестве параметра командной строки.

  3. Ваш клиент запускает "UpdateDLL.exe customer.dll myinfo.txt", чтобы обновить свою копию DLL своей информацией.

2 голосов
/ 09 мая 2009

Инструменты .NET (особенно компиляторы) включены в установку .NET Framework. Если вам не нужно, чтобы DLL была родной Win32, используйте Code DOM и поддержку фреймворка для динамического создания управляемой DLL.

Для перехода с Win32 на .NET COM - самый простой подход, но для этого требуется регистрация. Во избежание необходимости регистрации вашей динамической dll создайте dll, управляемый мостом, который предоставляет интерфейс COM, распространите его вместе с приложением и зарегистрируйте при установке. Он загружает (и может также создавать) динамически создаваемую DLL.

Таким образом, вам не нужно проверять, что у пользователя установлен Win32 SDK (или другой маршрут) для cl.exe и link.exe.

2 голосов
/ 09 мая 2009

Моя общая идея состоит в том, чтобы иметь такую ​​программу:

string UserName = "PLACEHOLDER UserName                     ";
string RegCode  = "PLACEHOLDER RegCode                      ";
bool CheckRegistration(string UserName, RegCode) {
  ...
}

Скомпилируйте это в файл .dll. Для каждого пользователя загрузите файл .dll, найдите в нем два PLACEHOLDER и замените их настоящими данными пользователя. Убедитесь, что вы дополняете строку пробелами.

1 голос
/ 11 мая 2009

Определите литералы как #define s, а затем все, что вам нужно сделать, это сгенерировать файл заголовка. Автоматическая система сборки позаботится обо всем остальном.

0 голосов
/ 09 мая 2009

Я предполагаю, что большая часть DLL, которую вам нужно сгенерировать, точно такая же, и единственное, что меняется, - это данные для каждого клиента, которые можно сказать, - строка. Если это так, то самый простой способ сделать это - добавить в свой код достаточно большой массив строк и заполнить его некоторым известным и уникальным шаблоном. произнесите что-то вроде "MYSTART-------------MYEND" и скомпилируйте DLL.
Чтобы сгенерировать DLL для каждого клиента, вам не нужно фактически перекомпилировать DLL, а только заменить эту уникальную строку строкой для каждого клиента. Вы должны убедиться, что длина строки, которую вы заменяете, точно соответствует размеру, который вы добавили в свой код, чтобы не добавлять байты в файл.
Вы можете выполнить этот поиск и заменить вручную, используя шестнадцатеричный редактор или трехстрочный скрипт на python / perl.

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