pinvoke für pointer-Parameter



  • Hallo,

    ich möchte eine Win32-DLL in C++/CLI einbinden. Dabei scheitere ich beim PInvoke bei den Pointern. Die Deklaration sieht z.B. so aus:

    extern "C" __declspec( dllexport ) BOOL __stdcall GetOperationMode(HANDLE KeyHandle,WORD NodeId,__int8* pMode,DWORD* pErrorCode);
    

    Der DllImport sieht wie folgt aus:

    [DllImport("xyDll", CharSet=CharSet::Ansi, CallingConvention = CallingConvention::Cdecl)]
    extern "C" BOOL __stdcall GetOperationMode(HANDLE KeyHandle, WORD NodeId, SBYTE^ pMode,UInt32^ pErrorCode);
    

    Der Aufruf dann:

    unsigned char m_cMode;
    DWORD dErrorCode;
    HANDLE m_KeyHandle;
    WORD m_wNodeId;
    ...
    GetOperationMode(m_KeyHandle, m_wNodeId, &m_cMode, &dErrorCode);
    

    Der Complier meldet dann:
    error C2664: 'GetOperationMode': Konvertierung des Parameters 3 von 'cli::interior_ptr<Type>' in 'System::SByte ^' nicht möglich

    Ich habe schon alle möglichen anderen Varianten versucht, die Pointer zu deklarieren und zu übergeben, komme aber nicht weiter. Beispiele bei Microsoft zur Übergabe der Pointer finde ich leider auch nicht.

    Kennt jemand die Lösung?

    gt



  • greentree schrieb:

    Hallo,

    ich möchte eine Win32-DLL in C++/CLI einbinden. Dabei scheitere ich beim PInvoke bei den Pointern. Die Deklaration sieht z.B. so aus:

    extern "C" __declspec( dllexport ) BOOL __stdcall GetOperationMode(HANDLE KeyHandle,WORD NodeId,__int8* pMode,DWORD* pErrorCode);

    Der DllImport sieht wie folgt aus:

    [DllImport("xyDll", CharSet=CharSet::Ansi, CallingConvention = CallingConvention::Cdecl)]
    extern "C" BOOL __stdcall GetOperationMode(HANDLE KeyHandle, WORD NodeId, SBYTE^ pMode,UInt32^ pErrorCode);

    Der Aufruf dann:

    unsigned char m_cMode;
    DWORD dErrorCode;
    HANDLE m_KeyHandle;
    WORD m_wNodeId;
    ...
    GetOperationMode(m_KeyHandle, m_wNodeId, &m_cMode, &dErrorCode);

    Der Complier meldet dann:
    error C2664: 'GetOperationMode': Konvertierung des Parameters 3 von 'cli::interior_ptr<Type>' in 'System::SByte ^' nicht möglich

    Ich habe schon alle möglichen anderen Varianten versucht, die Pointer zu deklarieren und zu übergeben, komme aber nicht weiter. Beispiele bei Microsoft zur Übergabe der Pointer finde ich leider auch nicht.

    Kennt jemand die Lösung?

    gt

    Ich bin mir nicht sicher, aber vielleicht hilft es die ^ aus der Definition zu entfernen und u.U. mit * zu ersetzen, oder System::IntPtr zu benutzen



  • Schau Dir einfach mal den Namen der Funktion in der DLL an. Die Funktion heisst *nicht* "GetOperationMode"!

    Auch würde ich empfehlen, einfach IJW zu verwenden und die h-Datei und lib-Datei einbinden und alles geht...
    Sonst brauchst Du ja kein C++/CLI, wenn Du es via P/Invoke machst...


Anmelden zum Antworten