![]() |
Variablenübergabe C-Programm an Delphi dll - Probleme
Folgendes Problem: In meiner delphi dll kommen einfach nicht alle drei Parameter an. Entweder es kommen docid und arcid an oder nur notiztx.
Wenn ich erst die Zuweisung mit GetChar mache und danach die einzelnen Werte aus der Tabelle auslese - dann kommen die Werte aus der Tabelle an (notiztx) Wenn ich nun erst die Werte aus der Tabelle auslese und dann die beiden Zuweisungen mit GetChar mache - dann kommen docid und arcid an Der jeweils fehlende Wert ist leer und das verstehe ich einfach nicht. Man sieht ja, wenn man beide Varianten ausprobiert, dass er richtige Werte übergibt, nur nicht alle drei. Hat jemand irgendeine Ahnung, woran das liegen könnte? Das Programm an sich läuft ohne Probleme durch und bricht auch nicht ab. relevante übergebene Parameter ITAB_H thItNotiz - das ist das Handle auf eine interne Tabelle ZRWF_INV1_ARCHIV_ID *iIArchivId - Typ RFC_CHAR ZRWF_INV1_ARC_DOC_ID *iIArchivDocId - Typ RFC_CHAR
Code:
RFC_RC WIN_DLL_EXPORT_FLAGS z_zrwf_notizen(RFC_HANDLE hRfc
,ZRWF_INV1_ARC_DOC_ID *iIArchivDocId ,ZRWF_INV1_ARCHIV_ID *iIArchivId ,ITAB_H thItNotiz) { unsigned int crow; char * lpt; int i; int len; //an die Variablen kommen, um diese zu übergeben char docId[100]; char arcId[100]; char notiz[1024]; char notiztx[1024]; //leer initialisieren notiztx[0] = '\0'; notiz[0] = '\0'; docid[0] = '\0'; arcID[0] = '\0'; //von RFC_CHAR nach CHAR umwandeln GETCHAR(*iIArchivDocId, docId); GETCHAR(*iIArchivId, arcId); //die Tabelle auslesen for (crow = 1;crow <= ItFill(thItNotiz); crow++) { lpt = (char *) ItGetLine(thItNotiz, crow); len = strlen(lpt)+1; memcpy( notiztx, (char *) ItGetLine( thItNotiz, crow ), len); notiztx[len] = '\0'; } //dll laden und benutzen HMODULE handle; handle = LoadLibrary("notiz.dll"); if (handle != NULL) { typedef char (*DLLFUNC)(char*, char*, char*); DLLFUNC func = (DLLFUNC)GetProcAddress(handle, "anhaengen"); if (func != NULL) { i = func(docId, arcId, notiztx); } } FreeLibrary(handle); //dll ist wieder freigegeben } |
Re: Variablenübergabe C-Programm an Delphi dll - Probleme
Poste doch mal mit Code- bzw. Delphi-Tags.
Schreib doch auch eine wirklich verstaendliche Frage mit vollstaendigen Informationen. Gebraucht werden die Funktinosdeklarationen auf C- und Delphi-Seite. Mein Verdacht ist das die DLL nicht mit stdcall an den Funktionen deklariert ist. |
Re: Variablenübergabe C-Programm an Delphi dll - Probleme
folgend ist die delphi-dll, die letztendlich erst mal nur die ihr übergebenen Werte anzeigen soll.
Delphi-Quellcode:
library notiz;
uses SysUtils, Classes, ComObj, ActiveX, StdVcl, Windows, Messages, Variants, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, uLogFile; {$R *.res} function anhaengen(docID, dbID, text: PChar): Integer; cdecl; var LogFile : TLogFile; LogName : String; begin Result:= 0; CoInitialize(nil); Result:= 100; LogFile:= TLogFile.Create; LogName:= ExtractFilePath(Application.ExeName)+'NotizAnhaengen.log'; LogFile.LogInfo('---NotizAnhaengen gestartet ---------------', LogName, 0, 0); LogFile.LogInfo('docid, dbid, notiz: '+ trim(docid)+','+ trim(dbid) +','+trim(text), LogName, 0, 0); LogFile.LogInfo('Result: '+ inttostr(Result), LogName, 0, 0); exit; end; exports anhaengen; begin end. |
Re: Variablenübergabe C-Programm an Delphi dll - Probleme
Wann genau kommt notiztx an, wenn du nur notiz übergibst?
|
Re: Variablenübergabe C-Programm an Delphi dll - Probleme
das sollte in dem Aufruf natürlich auch notiztx heissen
wenn ich die Aufruf in dieser Reihenfolge nacheinander aufrufe - dann kommt in der Dll notiztx an
Code:
//von RFC_CHAR nach CHAR umwandeln
GETCHAR(*iIArchivDocId, docId); GETCHAR(*iIArchivId, arcId); //die Tabelle auslesen for (crow = 1;crow <= ItFill(thItNotiz); crow++) { lpt = (char *) ItGetLine(thItNotiz, crow); len = strlen(lpt)+1; memcpy( notiztx, (char *) ItGetLine( thItNotiz, crow ), len); notiztx[len] = '\0'; } wenn ich die Aufruf in dieser Reihenfolge nacheinander aufrufe - dann kommt in der Dll docid und arcid an
Code:
Aber egal wie rum nun, es kommen nie alle drei an.
//die Tabelle auslesen
for (crow = 1;crow <= ItFill(thItNotiz); crow++) { lpt = (char *) ItGetLine(thItNotiz, crow); len = strlen(lpt)+1; memcpy( notiztx, (char *) ItGetLine( thItNotiz, crow ), len); notiztx[len] = '\0'; } //von RFC_CHAR nach CHAR umwandeln GETCHAR(*iIArchivDocId, docId); GETCHAR(*iIArchivId, arcId); |
Re: Variablenübergabe C-Programm an Delphi dll - Probleme
Mach mal
typedef char (* __cdecl DLLFUNC)(char*, char*, char*); damit die calling convention nicht von den Projektoptionen abhaengig ist. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:46 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz