2009-05-09 16 views
3

Ich muss wiederholt eine Win32-DLL mit einer Registrierungsinformation Funktion generieren. Diese Funktion verwendet Literale, um kundenspezifische Registrierungsinformationen zurückzugeben, wobei für jeden Kunden eine separate DLL erstellt wird.Programmgesteuert erzeugen Sie eine C Win32 DLL

Ich habe eine Testversion ordnungsgemäß funktioniert, mit fest codierten Informationen für einen Kunden. Die Dringlichkeit für einige Sites diktiert, dass ich einige DLLs manuell erzeuge, aber ich möchte dem Client eine Anwendung geben, die die C-Quelle dynamisch ausgibt und bei Bedarf eine DLL erstellt.

Was wäre der beste Weg, dies zu tun? Ich habe VS 2008 C++ Express und damit den cl.exe Compiler. Mein aktueller Ansatz wäre einfach, eine C# -Anwendung mit einer String-Konstanten für die C-Quelle zu haben, und vor der Generierung Token in diesen mit den erforderlichen Parametern zu ersetzen, dann zu bauen und zu verlinken, indem c.exe ausgemustert und ausgeführt wird.

+0

Ist cl.exe frei verteilbar? Wie werden Sie sicherstellen, dass die Benutzer Ihrer Software eine Kopie haben? –

+0

@Neil: IIRC ist es nicht. Aber es ist frei herunterladbar. – Richard

Antwort

1

Definieren Sie die Literale als #define s und dann alles, was Sie tun müssen, ist eine Header-Datei zu generieren. Ein automatisiertes Build-System kümmert sich um den Rest.

2

Meine allgemeine Idee ist, ein Programm wie dieses haben:

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

das Kompilieren zu einer .dll Datei. Laden Sie für jeden Benutzer die Datei .dll, suchen Sie die beiden PLACEHOLDER s und ersetzen Sie diese durch die echten Benutzerdaten. Stellen Sie sicher, dass Sie die Zeichenfolge mit Leerzeichen auffüllen.

0

Ich nehme an, dass die meisten der DLL, die Sie generieren müssen, genau die gleichen sind und das einzige, was sich ändert, sind die pro-Kundendaten, die man sagen kann, eine Zeichenfolge. Wenn dies der Fall ist, besteht die einfachste Möglichkeit darin, in Ihrem Code ein ausreichend großes String-Array hinzuzufügen und es mit einem bekannten und einzigartigen Muster zu füllen. sagen Sie etwas wie "MYSTART-------------MYEND" und kompilieren Sie die DLL.
Um die pro-Client-DLL zu generieren, müssen Sie die DLL nicht wirklich neu kompilieren, nur um diese eindeutige Zeichenfolge durch die pro-Client-Zeichenfolge zu ersetzen. Sie müssen sicherstellen, dass die Zeichenfolge, die Sie ersetzen, dieselbe Größe wie die, die Sie in Ihrem Code hinzugefügt haben, so dass Sie der Datei keine Bytes hinzufügen.
Sie können dies suchen und ersetzen manuell mit einem Hex-Editor oder mit einem 3-Zeilen-Python/Perl-Skript.

2

Die .NET-Tools (insbesondere Compiler) sind in der .NET Framework-Installation enthalten. Wenn Sie vermeiden können, dass die DLL native Win32 ist, dann verwenden Sie Code DOM und Framework-Unterstützung, um dynamisch eine verwaltete DLL zu erstellen.

Um von Win32 zu .NET zu überbrücken, ist COM der einfachste Ansatz, aber dies erfordert eine Registrierung. Um zu vermeiden, dass Ihre dynamische DLL eine Registrierung benötigt, erstellen Sie eine Bridge-verwaltete DLL, die eine COM-Schnittstelle verfügbar macht, diese mit Ihrer Anwendung verteilt und sie bei der Installation registriert. Es lädt (und könnte auch erstellen) die dynamisch erstellte DLL.

Auf diese Weise müssen Sie vermeiden, dass der Benutzer das Win32-SDK für cl.exe und link.exe installiert (oder eine andere Route) installiert haben muss.

5

Geben Sie alle Kundeninformationen als Zeichenfolgenressourcen in eine RC-Datei ein. Verknüpfen Sie die entsprechende RES-Datei in Ihre DLL. Der gesamte Code in der DLL, der von diesen Kundeninformationen abhängig ist, würde LoadString aufrufen, um dies abzurufen.

Erstellen Sie dann ein separates Programm (oder Funktion) namens "UpdateDLL.exe", das die Win32-APIs verwendet: BeginUpdateResource, UpdateResource usw., um die DLL mit den neuen Informationen zu aktualisieren.

Schiff die folgenden:

  1. Eine vorkompilierte DLL, die in den Ressourcen leer (oder Standard) Zeichenfolgen für die Kundeninformationen hat.

  2. Ihr UpdateDLL.exe-Tool, das den DLL-Namen und die Kundendatei als Befehlszeilenparameter verwendet.

  3. Ihr Kunde führt "UpdateDLL.exe customer.dll myinfo.txt" aus, um seine Kopie der DLL mit seinen Informationen zu aktualisieren.

+0

@selbie, das ist eine großartige Idee. Vielen Dank! – ProfK

Verwandte Themen