3 Stimmen

pinvoke from vb.net using structs in call

Ich habe wirklich Probleme mit dem folgenden Pinvoke-Aufruf. Ich habe versucht, zahlreiche verschiedene Möglichkeiten, dies zu tun, aber immer noch keine Freude.

Der Aufruf läuft durch, aber ich erhalte die Meldung "Bad parameter" zurück, die darauf hindeutet, dass mit der Struktur etwas nicht stimmt, da ich ein C++-Beispiel für diesen Code durchlaufen habe und die Parameter alle korrekt sind.

Ich wäre sehr dankbar für jede Hilfe, ich habe mich schon verrückt gegoogelt!

in der C++-Header-Datei:

int __stdcall DVSNET_OpenChannel(HANDLE hServer,unsigned long nChannel,DVSNET_CHANNEL_INFO *pChannelInfo,HANDLE *phChannel);

typedef struct tagDVSNET_CHANNEL_INFO
{
    unsigned long lStructSize;
    unsigned long dwStreamNo;
    unsigned long nProtocol;
    HWND          hWndDisplay;
    unsigned long bPlayStart;
    unsigned long dwBackFrameCount;
    unsigned long dwFlag;
} DVSNET_CHANNEL_INFO;

Meine Definitionen für den Import:

<DllImport("DVSNETClient.dll")> _
Public Shared Function DVSNET_OpenChannel(ByVal hServer As System.IntPtr, ByVal nChannel As UInteger, ByRef pChannelInfo As IntPtr, ByRef phChannel As IntPtr) As Integer
End Function

<StructLayout(LayoutKind.Sequential)> _
Public Structure tagDVSNET_CHANNEL_INFO
    Public lStructSize As UInteger
    Public dwStreamNo As UInteger
    Public nProtocol As UInteger
    Public hWndDisplay As IntPtr
    Public bPlayStart As UInteger
    Public dwBackFrameCount As UInteger
    Public dwFlag As UInteger
End Structure

Mein Calling Code:

Private Sub OpenChannel()
    Dim intRet As Integer
    Dim ChannelInfo As New tagDVSNET_CHANNEL_INFO

    Dim HWD As New System.IntPtr

    ChannelInfo.lStructSize = System.Runtime.InteropServices.Marshal.SizeOf(ChannelInfo)
    ChannelInfo.nProtocol = 0
    ChannelInfo.dwStreamNo = 0
    ChannelInfo.dwBackFrameCount = 10
    ChannelInfo.hWndDisplay = HWD
    ChannelInfo.bPlayStart = 0 ' dont display
    'Channelinfo.dwFlag = 

    ' Initialize unmanged memory to hold the struct.
    Dim ptr As IntPtr = Marshal.AllocHGlobal(Marshal.SizeOf(ChannelInfo))
    System.Runtime.InteropServices.Marshal.StructureToPtr(ChannelInfo, ptr, True)

    Dim nChannel As UInteger = 1
    intRet = TotemPoleLib.DVSNET_OpenChannel(hServer, nChannel, ptr, hChannel)

    '... snip ...
End Sub

Vielen Dank im Voraus!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X