Autor Beitrag
relapse
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 50



BeitragVerfasst: Mo 23.01.12 12:33 
Hallo zusammen!

Ich habe folgendes Problem: Ich muss eine C++ API-Funktion in C# "konvertieren". Die C++ Funktion hat die Signatur:
ausblenden Quelltext
1:
HRESULT PXCp_TransformPage (PDFDocument pDocument, DWORD PageNumber, LPCPXC_Matrix matrix, DWORD flags);					


Die Matrix-Struktur ist wie folgt deklariert:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
    public struct PXC_Matrix
    {
      public double  a;  //      | a b 0 |
      public double  b;  //      | c d 0 |
      public double  c;  //      | e f 1 |
      public double  d;  //
      public double  e;  // dx
      public double  f;  // dy
    };


Ich deklariere die API-Funktion im C#-Code auf diese Weise:
ausblenden C#-Quelltext
1:
2:
        [DllImport("xcpro40")]
        public static extern int PXCp_TransformPage(int pDocument, int iPageNumber, ref PXC_Matrix pMatrix, int iFlags);



Der Aufruf:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
            var TransformMatrix = new PdfXchangePro.PXC_Matrix() { a = 0.0, b = 0.0, c = 0.0, d = 0.0, e = 2.0, f = 3.0 };
            if (_documentId != 0)
            {
                int res = PdfXchangePro.PXCp_TransformPage(_documentId, 0ref TransformMatrix, 0x0001);
            }

wird mit einer AccesViolatioException "Es wurde versucht, im geschützten Speicher zu lesen oder zu schreiben. Dies ist häufig ein Hinweis darauf, dass anderer Speicher beschädigt ist." quittiert.

Ich habe dann im Forum einen ähnlichen Beitrag gefunden www.c-sharp-forum.de...ssviolationexception und versucht die Deklaration der API-Funktion anzupassen:
ausblenden C#-Quelltext
1:
public static extern int PXCp_TransformPage(int pDocument, int iPageNumber, [MarshalAs(UnmanagedType.Struct)] ref PXC_Matrix pMatrix, int iFlags);					

Nun bekomme ich bei der Ausführung die gleiche Exception-Meldung. Ich verstehe schon, dass das Problem in der Handhabung des Speichers ist aber mögliche Lösung finde ich im Moment nicht. Kann jemand mir helfen?

Danke!

Moderiert von user profile iconTh69: B- durch C#-Tags ersetzt
Moderiert von user profile iconTh69: Topic aus C# - Die Sprache verschoben am Mo 23.01.2012 um 12:38
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mo 23.01.12 13:36 
Hallo relapse,

bist du dir denn sicher, daß "PDFDocument" einfach nur einem 'int' entspricht? Wie sieht denn dafür die C++ Definition aus?
Ansonsten sieht der erste Aufruf aber korrekt aus (das mit dem [MarshalAs(UnmanagedType.Struct)] laß mal besser weg).
relapse Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 50



BeitragVerfasst: Mo 23.01.12 13:48 
Doch das ist ein Integer.

Die C++-Definition sieht so aus:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
PDFDocument hDocument;
PXC_Matrix TransformMatrix = {0};

TransformMatrix.e = 2.0;
TransformMatrix.f = 3.0;

HRESULT hr = PXCp_TransformPage(hDocument, 0, &TransformMatrix, TPF_KeepPageContentCropped);