Emulieren einer DLL

steyrer

Grünschnabel
Hallo,

ich möchte eine DLL (zum Ansprechen einer bestimmten Hardware) emulieren, damit ich eine Software auch ohne Hardware testen kann. Ich kann eine DLL erzeugen, die mit dem Original-Headerfile eingebunden werden kann, allerdings sieht die entsprechende lib anders aus und ich muss die Software neu linken, wenn ich die DLL austausche. Ich habe schon mit verschiedensten Einstellungen beim Erzeugen der DLL herumprobiert, mir gelingt es aber nicht, eine DLL zu erstellen, die ich einfach 1:1 als Ersatz verwenden kann (ohne erneutes Linken). Was muss man beim Erstellen einer DLL alles beachten? Wie kann ich wirklich einen 1:1 Ersatz für eine vorgegebenen DLL erstellen?

danke,

Andy
 
Ok, inzwischen bin ich schon etwas schlauer geworden: meine DLL wurde mit "decorated names" erzeugt (der VC compiler hat z.B. aus CardFind den Funktionsnamen _CardFind@4 gemacht); das kann man mit der calling convention __cdecl abstellen. Nur bekomme ich dann bei einem anderen Programm eine Fehlermeldung über "invalid stack pointer". Offenbar betrifft __cdecl nicht nur den decorated name sondern auch die stack-Behandlung. Einen entsprechenden Hinweis habe ich in der VC-Doku gefunden. Was ich wohl bräuchte wäre die __stdcall convention ohne die Erzeugung eines dekorierten Namens. Gibt es so etwas?

danke,

Andy
 
Lösung: Emulieren einer DLL

Der Vollständigkeit halber die möglichen Lösungen, falls jemand mal ein ähnliches Problem hat:

* mit dem C++Builder werden die Namen bei der calling convention __stdcall nicht dekoriert, das funktioniert dann.
* dem VC-Compiler kann man mittels einer .def-Datei die defaultmäßige Dekorierung bei __stdcall abdrehen.

Dahintergekommen bin ich durch den Fehler ERROR_PROC_NOT_FOUND beim Aufruf von GetProcAddress. Mittels eines "dll export viewers" (z.B. von http://www.nirsoft.net) habe ich dann die dekorierten Namen in meiner DLL entdeckt ...

Andy
 
Zurück