Hallo Delphi Praxis,
inzwischen habe ich das ganze mit der Anwendung die es zu unterstützen gilt getestet und bin leider nicht weitergekommen
Da ich jedoch nun alles hier bei mir habe um zu testen und auch "Fetzen" der alten C-
DLL gefunden habe die es zu ersetzen
gilt hoffe ich das ich mit eurer Hilfe das ganze doch noch abeschliessen kann
Also hier mal n bisschen C Source der alten
DLL:
DLL Header Datei
Code:
#ifndef _DLL_H_
#define _DLL_H_
#include <Windows.h>
#ifdef __cplusplus
extern "C"
{
#endif
#if BUILDING_DLL
# define DLLIMPORT __declspec (dllexport)
#else /* Not BUILDING_DLL */
# define DLLIMPORT __declspec (dllimport)
#endif /* Not BUILDING_DLL */
#ifndef DLL_CALL
#define DLL_CALL __stdcall
#endif
struct LSLSimpleParams
{
int productCode;
HWND windowsHandle;
};
DLLIMPORT double DLL_CALL lsl_getNumberOfDays(struct LSLSimpleParams *parameters);
#ifdef __cplusplus
}
#endif
#endif /* _DLL_H_ */
DLL-Code
Code:
DLLIMPORT double DLL_CALL lsl_getNumberOfDays(struct LSLSimpleParams *parameters)
{
double nofDays = 9999;
int atLeastOneLicenceFound = 0;
if(!parameters || parameters->productCode > maxProductKey)
nofDays = -9999;
return nofDays;
}
Diese Funktionen brauch ich zwar in meiner neuen
DLL noch nicht, sind aber ein Beispiel für eine Funktionierende Funktion
in der alten
DLL! Mir geht es nur um die Parameterübergabe da ich das neue Programm schon soweit habe das es einige von
mir gewünschte Funktionen aufruft, der Code darin ausgeführt wird und weiterläuft. Das einzige was ich nicht schaffe sind
die Parameter auszulesen! Ich bekomme ja einen Pointer auf eine Struktur. Soweit ich es dem C Code entnehmen kann muss
ich einfach nur diese Struktur auslesen, ich muss doch keinen Specherplatz allokieren oder freigeben
Jetzt mal n bisschen Beispielcode von mir
Delphi-Quellcode:
library intelliDLL;
{ Wichtiger Hinweis zur DLL-Speicherverwaltung: ShareMem muß sich in der
ersten Unit der unit-Klausel der Bibliothek und des Projekts befinden (Projekt-
Quelltext anzeigen), falls die DLL Prozeduren oder Funktionen exportiert, die
Strings als Parameter oder Funktionsergebnisse übergeben. Das gilt für alle
Strings, die von oder an die DLL übergeben werden -- sogar für diejenigen, die
sich in Records und Klassen befinden. Sharemem ist die Schnittstellen-Unit zur
Verwaltungs-DLL für gemeinsame Speicherzugriffe, BORLNDMM.DLL.
Um die Verwendung von BORLNDMM.DLL zu vermeiden, können Sie String-
Informationen als PChar- oder ShortString-Parameter übergeben. }
uses
SysUtils,
Classes;
Type
TWriteEventStructure =
Record
entityID,
lkNumber,
locationNumber,
resourceNumber,
vWochenTag,
vAnzeigeStd,
vAnzeigeMin,
vAnzeigeSek: Integer;
fHandle: THandle;
End;
Function eventEntityCreate(
Const Parameter: TWriteEventStructure): Double;
cdecl;
Begin
AddToLogfile(eventLogName,
'
Methode : DLL-Methode des Events' + #13#10 +
'
EventNr : '+IntToStr(uDMEvents.evtEntityCreate) + #13#10 +
'
entityID : '+IntToStr(Parameter.entityID) + #13#10 +
'
lkNumber : '+IntToStr(Parameter.lkNumber) + #13#10 +
'
locationNumber: '+IntToStr(Parameter.locationNumber) + #13#10 +
'
resourceNumber: '+IntToStr(Parameter.resourceNumber) + #13#10 +
'
vWochenTag : '+IntToStr(Parameter.vWochenTag) + #13#10 +
'
vAnzeigeStd : '+IntToStr(Parameter.vAnzeigeStd) + #13#10 +
'
vAnzeigeMin : '+IntToStr(Parameter.vAnzeigeMin) + #13#10 +
'
vAnzeigeSek : '+IntToStr(Parameter.vAnzeigeSek)
);
Result := 0;
End;
// Alle exportierten Methoden dieser DLL
exports
eventEntityCreate;
Function onExitDLL: Boolean;
Begin
Result := True;
End;
begin
// Neue Ausstiegsprozedur registrieren
AddTerminateProc(onExitDLL);
end.
Die Methode AddtoLogfile schreibt mir das ganze in eine textdatei, was auch funktioniert aber die Werte (sollten alle 0 sein)
wirken auf mich wie uninitialsiert, es sind irgendwelche Werte (interessant war auch das die gleich blieben, das heisst
Aufrufendes Programm wurde 3 mal gestartet -> Funktion 3 mal aufgerufen -> jedes mal Quatsch, aber der gleiche).
Vielleicht könnt ihr mir noch weiterhelfen bin ich echt am verzweifeln! Habs schon mit stdcall als Aufrufkonvention probiert oder mit nem Packed Record als Struktur aber einfach kein erfolg!
Bin über jeden Tip dankbar!