Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Parameterübergabe C# dll (https://www.delphipraxis.net/200777-parameteruebergabe-c-dll.html)

jsp 24. Mai 2019 09:24

Delphi-Version: 5

Parameterübergabe C# dll
 
Hallo und guten Morgen

Ich möchte folgende c#-Funktion aufrufen:

Code:
  //* CibZugferdSDKIsZugferd                                                               *//
  //* checks, if a file is a zugferd invoice                                               *//
  //*                                                                                       *//
  //* pdfFile: input pdf file                                                              *//
  //* isZugferd: pointer to the output bool value                                          *//
  //* return value:                                                                        *//
  //* 0 = no zugferd xml embedded                                                          *//
  //* 1 = has zugferd xml embedded                                                         *//
  //* < 0 = error, see error codes                                                         *//

  DllExport int WINAPI CibZugferdSDKIsZugferd(const char* pdfFile);
In Delphi habe ich die Funktion wie folgt deklariert:
Delphi-Quellcode:
Function CibZugferdSDKIsZugferd(const pdfFile : PChar) : Integer; stdcall; external 'CibZugferdSDK32.dll' name 'CibZugferdSDKIsZugferd';
Aufgerufen wird die Funktion wie folgt:
Delphi-Quellcode:
  inputPdfFile := exePath+'zugferdembedded.pdf'; // strings

  if FileExists(inputPdfFile) then
  begin
    res := CibZugferdSDKIsZugferd(PChar(inputPdfFile));
  end;
res ist immer -102, was 'error during reading occured' bedeutet.
Ich gehe davon aus, dass in der dll der Filename nicht korrekt ankommt.

Wie mach ich's richtig?

Gruss, Jörn

TiGü 24. Mai 2019 09:37

AW: Parameterübergabe C# dll
 
https://www.cib.de/fileadmin/media/d..._Anleitung.pdf

Zitat:

2.1 PRÜFEN EINES PDF-DOKUMENTS ALS ZUGFERD-KONFORM
Code:
int CibZugferdSDKIsZugferd(const char* pdfFile);
Die Funktion CibZugferdSDKIsZugferd prüft, ob das angegebene Dokument dem ZUGFeRDStandard entspricht und eine Rechnung mit ZUGFeRD Informationen vorliegt.

Rückgabewerte:
 
ERR_ZUGFERD_OK_HAS_ZUGFERD - Die vorliegende PDF Datei ist ZUGFeRD kompatibel.
ERR_ZUGFERD_OK_NO_ZUGFERD - Die vorliegende PDF Datei ist nicht ZUGFeRD kompatibel.

Wenn es innerhalb des SDK zu einer Fehlersituation gekommen ist, wird ein anderer ERR_ZUGFERD–
Wert zurückgegeben. Die Fehlerwerte und ihre Bedeutung entnehmen Sie der Datei
CibZugferdSDK.h.
Was sagt der angesprochene Header zu -102?
Es ist übrigens eine C-Style DLL (kein C#).

Ich hätte die Funktion auch so definiert. Du kannst ggf. prüfen, ob dein Verdacht richtig ist, indem du anstatt PChar explizit mal die Varianten PWideChar bzw. PAnsiChar probierst.
Ggf. findet sich in der Dokumentation auch eine genaue Beschreibung, welcher Art Stringzeiger erwartet wird.

TiGü 24. Mai 2019 09:48

AW: Parameterübergabe C# dll
 
Ich sehe schon, der dünne Header gibt dem Entwickler nicht allzu viele Informationen.

Versuche es mal mit der PAnsiChar Variante.
Im C# Beispiel "CibZugferdSdk.cs werden die Funktionen ja explizit mit dem CharSet.Ansi importiert.

Code:
        public static CibZugferdStatus CibZugferdSDKIsZugferd(string pdfFile)
        {
            Int32 ret = 0;
            if (IntPtr.Size == 8)
            {
                ret = CibZugferdSDKIsZugferd64(pdfFile);
            }
            else
            {
                ret = CibZugferdSDKIsZugferd32(pdfFile);
            }

            return (CibZugferdStatus) ret;
        }

        [DllImport("CibZugferdSDK32.dll", EntryPoint = "CibZugferdSDKIsZugferd",
        CharSet = CharSet.Ansi)]
        private static extern Int32 CibZugferdSDKIsZugferd32(
            string pdfFile
            );

        [DllImport("CibZugferdSDK64.dll", EntryPoint = "CibZugferdSDKIsZugferd",
        CharSet = CharSet.Ansi)]
        private static extern Int32 CibZugferdSDKIsZugferd64(
            string pdfFile
            );

jsp 24. Mai 2019 09:50

AW: Parameterübergabe C# dll
 
Danke TiGü

die Doku ist mir bekannt :wink:

Mit PAnsiChar funktioniert's jetzt.

Gruss, Jörn


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:38 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