AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi C nach Delphi (Pascal) Konvertierungsproblem
Thema durchsuchen
Ansicht
Themen-Optionen

C nach Delphi (Pascal) Konvertierungsproblem

Offene Frage von "MiniMatrix"
Ein Thema von MiniMatrix · begonnen am 22. Feb 2010 · letzter Beitrag vom 2. Mär 2010
Antwort Antwort
MiniMatrix

Registriert seit: 5. Feb 2010
16 Beiträge
 
#1

C nach Delphi (Pascal) Konvertierungsproblem

  Alt 22. Feb 2010, 11:27
Hi

Ich versuche mich gerade bei der Portierung eines C Quellcodes nach Delphi (Pascal) und stoße da leider an meine Verständnisgrenzen und hoffe, es kann mir jemand hier helfen:

Der Funktionskopf einer Funktion sieht folgendermaßen aus:

Code:
STATUS LNPUBLIC DBDPerformFunction( DBVEC *vec, HDBDSESSION hSession, WORD Function, WORD argc, DWORD *argl, void **argv, HANDLE *rethResult, DWORD *retResultLength )
Dem Parameter "void **argv" kann ich leider überhaupt nicht entnehmen, um was für einen Typ es sich handelt (außer der Tatsache (?), das es ein Zeiger auf einen Zeiger ist).

Im Code findet sich dann das Folgende:
Code:
typedef struct { USHORT ListEntries;
} LIST;

char      *pData;
char      *pFileName;            /* Pointer to database filename         */
DWORD     FileNameLen;           /* Length of packed filename string.    */

...

pData = (char *)argv[0];            /* Get pointer to data   */

...

pData += sizeof(WORD);        /* Step past the datatype word        */
pData += sizeof(LIST);        /*   and step past the list header.   */

FileNameLen = *(WORD *)pData; /* Save length of filename.           */
pData += sizeof(WORD);        /* Step past filename length          */
pFileName = pData;            /* Save pointer to database file name. */

pData = (char *) argv[1]; /* Then the 2nd one should be the key */
                  /*   on which to search;              */
pData += sizeof(WORD);    /* Step past the datatype word        */
pData += sizeof(LIST);    /*   and step past the list header.   */
   
KeyLen = *(WORD *)pData;  /* Save length of key.                */
pData += sizeof(WORD);    /* Step past key length               */
pKey = pData;             /* Save pointer to key.               */

...

Mein Pascal Transfer sieht für den Funktionsaufruf folgendermaßen aus (wobei man durchaus statt "pArgv" auch "TArgv" verwenden könnte, da Pascal ja Strukturen immer als "Zeiger auf" übergibt), wobei ich den Datentyp des Parameters "argv" umgesetzt habe als ein "packed array of pChar", mir aber absolut unklar ist, ob dies so überhaupt korrekt ist):

Delphi-Quellcode:
type
  USHORT = WORD;

  LIST = packed record
    ListEntries: USHORT;
  end;

  pArgv = ^TArgv;
  TArgv = packed array of pChar;

function DBDPerformFunction( vec: pDBVEC; hSession: HDBDSESSION; pFunction: WORD; argc: WORD; argl: pDWORD; argv: pArgv; rethResult: pHANDLE; retResultLength: pDWORD ): STATUS;

var
  pData : pChar;
  pFileName : pChar; {* Pointer to database filename               *}
  FileNameLen : DWORD; {* Length of packed filename string.          *}

begin

  pData := pChar( argv^[ 0 ] ); {* Get pointer to data    *}

  ...

  pData := pData + System.SizeOf( WORD ); {* Step past the datatype word         *}
  pData := pData + System.SizeOf( LIST ); {* and step past the list header.      *}

  FileNameLen:= WORD( pData ); {* Save length of filename.            *}
  pData := pData + System.SizeOf( WORD ); {* Step past filename length           *}
  pFileName := pData; {* Save pointer to database file name. *}

  pData := pChar( argv^[ 1 ] ); {* Then the 2nd one should be the key on which to search; *}
  pData := pData + System.SizeOf( WORD ); {* Step past the datatype word         *}
  pData := pData + System.SizeOf( LIST ); {*   and step past the list header.    *}
  KeyLen:= WORD( pData ); {* Save length of key.                 *}
  pData := pData + System.SizeOf( WORD ); {* Step past key length                *}
  pKey := pData;

  ...

end;

Das Programm stützt nicht ab, aber in den Variablen "FileNameLen", "pFileName", "KeyLen" und "pKey" steht nie was drin, was nicht richtig sein kann.
Ich denke, ich habe einfach den Transfer nicht richtig "hin" bekommen.
Eventuell kann jemand hier helfen ? Wäre toll !

[edit=SirThornberry]Verschidene Quellcode-tags gesetzt - nächstes mal bitte selbst machen. Mfg, SirThornberry[/edit]
  Mit Zitat antworten Zitat
Chris.R

Registriert seit: 8. Sep 2009
Ort: Nürnberg
68 Beiträge
 
Delphi 2010 Professional
 
#2

Re: C nach Delphi (Pascal) Konvertierungsproblem

  Alt 22. Feb 2010, 15:20
Hallo,

Hast du auch die Aufrufkonvention beachtet? C hat meist stdcall.

Außerdem kann man Pointer auch als var Parameter definieren:

function DBDPerformFunction( vec: pDBVEC; hSession: HDBDSESSION; pFunction: WORD; argc: WORD; var argl: DWORD; var argv: pArgv; var rethResult: HANDLE; var retResultLength: DWORD ): STATUS; stdcall; Ciao Chris
Guten Morgen! … Und falls wir uns heute nicht mehr sehen, Guten Tag, Guten Abend und Gute Nacht!
  Mit Zitat antworten Zitat
Benutzerbild von implementation
implementation

Registriert seit: 5. Mai 2008
940 Beiträge
 
FreePascal / Lazarus
 
#3

Re: C nach Delphi (Pascal) Konvertierungsproblem

  Alt 22. Feb 2010, 15:25
Nur, wenn auch "__stdcall" vorsteht, sonst ist es automatisch "__cdecl".
  Mit Zitat antworten Zitat
MiniMatrix

Registriert seit: 5. Feb 2010
16 Beiträge
 
#4

Re: C nach Delphi (Pascal) Konvertierungsproblem

  Alt 22. Feb 2010, 18:03
Ähm, ja. Schon klar.

Aber ich rufe nicht eine Funktion, sondern werde informiert. Also die Funktion "DBDPerformFunction" ist in meiner eigenen DLL. Sie wird aufgerufen und übergibt an mich diese Parameter. Der Fehler scheint im Parameter "argv" zu stecken (Zeiger auf ein Zeigerarray von nullterminierten Strings).

===================
Interface

function DBDPerformFunction( vec: pDBVEC; hSession: HDBDSESSION; pFunction: WORD; argc: WORD; argl: pDWORD; argv: pArgv; rethResult: pHANDLE; retResultLength: pDWORD ): STATUS; stdcall; far;
...
===================
  Mit Zitat antworten Zitat
MiniMatrix

Registriert seit: 5. Feb 2010
16 Beiträge
 
#5

Re: C nach Delphi (Pascal) Konvertierungsproblem

  Alt 22. Feb 2010, 18:21
Die Verwendung von "cdecl" oder "stdcall" scheint keinen Unterschied zu machen. Es ist aber schon so, dass bei der Beispieldefinition in C die Angabe fehlt, weswegen ich wohl besser bei cdecl bleibe, oder?
  Mit Zitat antworten Zitat
Chris.R

Registriert seit: 8. Sep 2009
Ort: Nürnberg
68 Beiträge
 
Delphi 2010 Professional
 
#6

Re: C nach Delphi (Pascal) Konvertierungsproblem

  Alt 22. Feb 2010, 20:55
Hallo,

hast du schon mal ausprobiert,

argv: pArgv durch

var argv: pArgv oder

const argv: pArgv zu ersetzen?

Ciao Chris
Guten Morgen! … Und falls wir uns heute nicht mehr sehen, Guten Tag, Guten Abend und Gute Nacht!
  Mit Zitat antworten Zitat
MiniMatrix

Registriert seit: 5. Feb 2010
16 Beiträge
 
#7

Re: C nach Delphi (Pascal) Konvertierungsproblem

  Alt 2. Mär 2010, 13:55
So, ich habe das Problem gelöst:

Als erstes habe ich die Definition des Datentyps für den Parameter "argv" umgestellt und erweitert:

Delphi-Quellcode:
type
  ppArgv = ^pArgv;
  pArgv = ^TArgv;
  TArgv = array of pointer;
und den Parameter definiert als:

argv: ppArgv;


Der weitere Zugriff erfolgt nun über:

Delphi-Quellcode:
  pData := pChar( argv^ ); {* Get pointer to data    *}

  ...

  pData := pData + System.SizeOf( WORD ); {* Step past the datatype word         *}
  pData := pData + System.SizeOf( LIST ); {* and step past the list header.      *}

  FileNameLen:= pWORD( pData )^; {* Save length of filename.            *}
  pData := pData + System.SizeOf( WORD ); {* Step past filename length           *}
  pFileName := pData; {* Save pointer to database file name. *}
  pData := pData + FileNameLen;

  pData := pData + System.SizeOf( WORD ); {* Step past the datatype word         *}
  pData := pData + System.SizeOf( LIST ); {*   and step past the list header.    *}

  KeyLen:= pWORD( pData )^; {* Save length of key.                 *}
  pData := pData + System.SizeOf( WORD ); {* Step past key length                *}
  pKey := pData;
  pData := pData + KeyLen;
Einziger Wehrmutstropfen ist, dass die Information bezüglich des Array's in C verloren geht. Aber eventuell gibt es ja jemanden, der hierzu noch eine Idee hat.
  Mit Zitat antworten Zitat
Fridolin Walther

Registriert seit: 11. Mai 2008
Ort: Kühlungsborn
446 Beiträge
 
Delphi 2009 Professional
 
#8

Re: C nach Delphi (Pascal) Konvertierungsproblem

  Alt 2. Mär 2010, 16:00
Obligatorische Frage: Welche Delphi Version benutzt Du?
Fridolin Walther
"While Mr. Kim, by virtue of youth and naiveté, has fallen prey to the inexplicable need for human contact, let me step in and assure you that my research will go on uninterrupted, and that social relationships will continue to baffle and repulse me."
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:18 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz