Einzelnen Beitrag anzeigen

Benutzerbild von mika
mika

Registriert seit: 25. Okt 2002
176 Beiträge
 
Delphi 6 Professional
 
#16

Re: Wer kann mir diese C Funktion uebersetzen?

  Alt 6. Feb 2006, 20:46
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!
:: don't Panic ::
  Mit Zitat antworten Zitat