Einzelnen Beitrag anzeigen

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