Laden...

DllImport Problem mit Aufruf

Erstellt von B3nj vor 14 Jahren Letzter Beitrag vor 14 Jahren 1.008 Views
B3nj Themenstarter:in
242 Beiträge seit 2006
vor 14 Jahren
DllImport Problem mit Aufruf

Hallo,

Ich habe eine Dll importiert bzw eine Methode der Dll, hier der Code:

SECItem *
NSSBase64_DecodeBuffer (PRArenaPool *arenaOpt, SECItem *outItemOpt,
                        const char *inStr, unsigned int inLen)
{
    return NSSBase64_DecodeBuffer_Util(arenaOpt, outItemOpt, inStr, inLen);
}

http://www.google.com/codesearch/p?hl=de#e_ObwTAVPyo/security/nss/lib/nss/utilwrap.c&q=NSSBase64_DecodeBuffer&l=734

Zum verständnis noch SECItem:

struct SECItem {
  SECItemType type;
  unsigned char *data;
  unsigned int len;
};

http://www.google.com/codesearch/p?hl=de#YwaaF8DorRY/src/chrome/browser/importer/firefox_importer_utils.h&q=SECItem&l=125

Und noch SECItemType:

enum SECItemType {
  siBuffer = 0,
  siClearDataBuffer = 1,
  siCipherDataBuffer = 2,
  siDERCertBuffer = 3,
  siEncodedCertBuffer = 4,
  siDERNameBuffer = 5,
  siEncodedNameBuffer = 6,
  siAsciiNameString = 7,
  siAsciiString = 8,
  siDEROID = 9,
  siUnsignedInteger = 10,
  siUTCTime = 11,
  siGeneralizedTime = 12
};

http://www.google.com/codesearch/p?hl=de#YwaaF8DorRY/src/chrome/browser/importer/firefox_importer_utils.h&q=SECItemType&l=109

Und ein Aufruf der NSSBase64_DecodeBuffer-Funktion:

SECItem newResult = {0, 0, 0};
SECItem *ok = NSSBase64_DecodeBuffer(NULL, &newResult,
                               (const char *)result.data, result.len);

Ich habe schon alles möglihc eprobiert, aber nie hat es funktioniert.

Hier habe ich z.B. die Struktut SECItem nachgebaut:

        public struct SECItem
        {
            public Int32 type;
            public char[] data;
            public Int32 length;
        }

Und hier die Methodendeklaration:

        [DllImport(@"nss3.dll", CharSet = CharSet.Ansi)]
        public static extern int NSSBase64_DecodeBuffer(object val, ref SECItem output, StringBuilder input, UInt32 inputLength);[/csharp

Wobei diese habe ich schon tausendmal geändert, halt aus Not mal alles ausprobiert.

Aktuell sieht der Aufruf so aus:
[csharp]                SECItem output1 = new SECItem();
                output1.data = new char[1000];
                output1.length = 1000;
...
NSSBase64_DecodeBuffer(null, ref output1, code, (UInt32)code.Length);

Das Ergebnis ist eine SafeArrayTypeMistmatchException, mit der folgenden Message:
"Das angegebene Array hat nicht den erwarteten Typ."

Kann mir hier bitte jemand helfen?

mfG benj

R
103 Beiträge seit 2009
vor 14 Jahren

Hallo,

habe das hier nur flüchtig überflogen, aber eins ist mir trotzdem gleich aufgefallen:
unsigned char in C ist nicht das gleiche wie der char Typ in C# (Unicode)

Ausserdem muss der Puffer unmanaged reserviert werden.
also etwa so:

IntPtr iPtr = Marshal.AllocHGlobal(1000);

.. und hinterher wieder freigeben werden

Marshal.FreeHGlobal(iPtr); 

in einen C# string kannst Du das z.B. mit

Marshal.PtrToStringAnsi()

wieder umwandeln.

Schau dir mal den Marshal Namespace genauer an, gibt auch sonst ne Menge Beispiele im Netz.