Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Variablenübergabe C-Programm an Delphi dll - Probleme (https://www.delphipraxis.net/84909-variablenuebergabe-c-programm-delphi-dll-probleme.html)

Susanne 23. Jan 2007 14:59


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
}

Robert Marquardt 23. Jan 2007 15:08

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.

Susanne 23. Jan 2007 15:17

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.

sirius 23. Jan 2007 15:27

Re: Variablenübergabe C-Programm an Delphi dll - Probleme
 
Wann genau kommt notiztx an, wenn du nur notiz übergibst?

Susanne 23. Jan 2007 15:37

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:
  //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);
Aber egal wie rum nun, es kommen nie alle drei an.

Robert Marquardt 23. Jan 2007 18:19

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 16:57 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