Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从VC++;由于缺少链接库,从dll到VB函数返回错误 我正在把一个摄像机的SDK从C++转换成VB。p>_C++_Vb.net_Dll_Runtime_Dllimport - Fatal编程技术网

从VC++;由于缺少链接库,从dll到VB函数返回错误 我正在把一个摄像机的SDK从C++转换成VB。p>

从VC++;由于缺少链接库,从dll到VB函数返回错误 我正在把一个摄像机的SDK从C++转换成VB。p>,c++,vb.net,dll,runtime,dllimport,C++,Vb.net,Dll,Runtime,Dllimport,我使用dll导入从供应商导入库 在运行第一个函数时,它似乎返回了camera类的有效指针(返回的指针不为null): 我这样声明函数: <DllImport("KMpeg4.dll", SetLastError:=True, CharSet:=CharSet.Auto, CallingConvention:=CallingConvention.Cdecl)> _ Shared Function KOpenInterface() As System.IntPtr Di

我使用dll导入从供应商导入库

在运行第一个函数时,它似乎返回了camera类的有效指针(返回的指针不为null):

我这样声明函数:

<DllImport("KMpeg4.dll", SetLastError:=True, CharSet:=CharSet.Auto, CallingConvention:=CallingConvention.Cdecl)> _
    Shared Function KOpenInterface() As System.IntPtr
    Dim mcc As structural_MEDIA_CONNECTION_CONFIG2
    Dim last_error As UInteger

    mcc = New structural_MEDIA_CONNECTION_CONFIG2()

    mcc.UserID = "root"
    mcc.Password = "123456"
    mcc.UniCastIP = "192.168.10.242 \0"
    mcc.HTTPPort = 80
    mcc.ContactType = CONTACT_TYPE.CONTACT_TYPE_UNICAST_PREVIEW
    mcc.RegisterPort = 6000
    mcc.ControlPort = 6001
    mcc.StreamingPort = 6002
    mcc.ChannelNumber = 0
    mcc.MultiCastIP = "172.16.1.105\0"
    mcc.MultiCastPort = 5000
    mcc.ConnectTimeOut = 3

    Dim myCamera1 As IntPtr = GlobalMembersSDK10000.KOpenInterface()

    If myCamera1 <> IntPtr.Zero Then


        If GlobalMembersSDK10000.KSetMediaConfig2(myCamera1, mcc) Then
            If GlobalMembersSDK10000.KConnect(myCamera1) Then



                If GlobalMembersSDK10000.KStartStreaming(myCamera1) Then


                    GlobalMembersSDK10000.KPlay(myCamera1)
                End If
            End If
        Else
            last_error = GlobalMembersSDK10000.KGetLastError(myCamera1)
            MessageBox.Show("ACTI camera not configured: error ", last_error.ToString)
        End If
    Else
        last_error = GlobalMembersSDK10000.KGetLastError(myCamera1)
        MessageBox.Show("ACTI camera object not created: error ", last_error.ToString)
    End If
<DllImport("KMpeg4.dll", SetLastError:=True, CharSet:=CharSet.Auto, CallingConvention:=CallingConvention.Cdecl)> _
Shared Function KSetMediaConfig2(ByVal h As System.IntPtr, ByVal MediaConfig As structural_MEDIA_CONNECTION_CONFIG2) As Boolean

End Function
在上一次打印时,我忘了删除KMpeg4.dll过滤器,但即使在没有过滤器的情况下查看,程序正在查找的函数也在一条或另一条路径中

谢谢


威廉

好的,我发现了问题。这是代码相关的

我需要整理我从C++传递的结构,作为参数:

原始typedef结构:

typedef struct structural_MEDIA_VIDEO_CONFIG2
{
    short dwEncoder;            // 1:MPEG4 4:MPEG4 5:H264
    short dwTvStander;          // 0:NTSC 1:PAL
    short dwVideoResolution;    // See the definition above
    short dwBitsRate;           // See the definition above
    short dwQuality;            // 0 ~ 100 : Low ~ High
    short dwVideoBrightness;    // 0 ~ 100 : Low ~ High
    short dwVideoContrast;      // 0 ~ 100 : Low ~ High
    short dwVideoSaturation;    // 0 ~ 100 : Low ~ High
    short dwVideoHue;           // 0 ~ 100 : Low ~ High
    short dwFps;                // 0 ~ 30 frame pre second
} MEDIA_VIDEO_CONFIG2;
VB中的转换结构:

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Ansi)> _
Public Structure structural_MEDIA_CONNECTION_CONFIG2
    Public ContactType As Integer

    Public ChannelNumber As Byte ' For URL Command CHANNEL tag, when set it to 0, URL command won't bring CHANNEL tag, or the URL command will bring CHANNEL=ChannelNumber tag  )
    Public TCPVideoStreamID As Byte ' 0 based to specify video track, value 0 to 255 for 1 to 256 video track
    Public RTPVideoTrackNumber As Byte ' set it to 0, ARTP will use 1st video track,  1 to 255 is for specify video track
    Public RTPAudioTrackNumber As Byte ' set it to 0, ARTP will use 1st audio track,  1 to 255 is for specify audio track

    <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=32)> _
    Public UniCastIP As String
    <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=32)> _
    Public MultiCastIP As String
    <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=32)> _
    Public PlayFileName As String
    <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=32)> _
    Public UserID As String
    <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=32)> _
    Public Password As String
    Public RegisterPort As UInteger
    Public StreamingPort As UInteger
    Public ControlPort As UInteger
    Public MultiCastPort As UInteger
    Public SearchPortC2S As UInteger
    Public SearchPortS2C As UInteger
    Public HTTPPort As UInteger
    Public RTSPPort As UInteger
    Public Reserved1 As UInteger
    Public Reserved2 As UInteger

    Public ConnectTimeOut As UShort
    Public EncryptionType As UShort
End Structure
_
公共结构结构\媒体\连接\配置2
公共联系人类型为整数
公共ChannelNumber作为URL命令通道标记的字节,当设置为0时,URL命令不会带来通道标记,或者URL命令会带来通道=通道号标记)
基于字节“0”的公共TCPVideoStreamID用于指定视频曲目,1到256视频曲目的值为0到255
公共RTPVideoTrackNumber As Byte'将其设置为0,ARTP将使用第一个视频曲目,1到255用于指定视频曲目
公共RTPAudioTrackNumber As Byte'将其设置为0,ARTP将使用第一个音频曲目,1到255用于指定音频曲目
_
公共UniCastIP作为字符串
_
公共多字符串
_
作为字符串的公共播放文件名
_
作为字符串的公共用户ID
_
作为字符串的公共密码
作为UInteger的公共注册端口
公共流线港作为一个整体
公共控制端口作为UInteger
公共多播端口作为UInteger
公共搜索端口C2S作为UInteger
公共搜索端口2C作为UInteger
公共HTTPPort作为UInteger
公共RTS端口为UInteger
作为一个整体的公共储备1
作为UInteger的公共储备2
公共连接超时为UShort
公共加密类型为UShort
端部结构
我需要将函数的声明参数改为ByRef而不是ByVal:

<DllImport("KMpeg4.dll", SetLastError:=True, CharSet:=CharSet.Ansi, CallingConvention:=CallingConvention.Cdecl)> _
Shared Function KSetMediaConfig2(ByVal h As System.IntPtr, ByRef MediaConfig As structural_MEDIA_CONNECTION_CONFIG2) As Boolean
End Function
_
共享函数KSetMediaConfig2(ByVal h作为System.IntPtr,ByRef MediaConfig作为structural_MEDIA_CONNECTION_CONFIG2)作为布尔值
端函数
这让我进入了下一个阶段


William

建议与您前面的问题完全相同,请确保复制此组件所需的所有DLL。您的意思是,代码没有问题?我已经在SDK提供给我的所有dll上完成了您在上一个问题上建议的步骤,但我仍然有相同的问题,因为它在库中,我不知道如何跟踪KMpeg4.dll正在寻找的额外库。我担心我应该封送一个参数或使用与DllImport不同的东西,比如Declare Auto或delegates当然我也不知道,这不是一个常见的组件。如果它不在手册或自述文件中,那么请联系组件的所有者以获得部署建议,如果它不是直接的,他们总是有它。您还可以运行SysInternals的ProcMon,您将看到您的程序正在搜索DLL,但没有找到它。它也可能是一个配置文件设置错误或丢失,这里任何事情都有可能。所有提供程序dll都在主目录中,如果较新,请复制。我确实就此事联系了提供商,但我正在等待,将尝试SysInternals的ProcMon
<DllImport("KMpeg4.dll", SetLastError:=True, CharSet:=CharSet.Ansi, CallingConvention:=CallingConvention.Cdecl)> _
Shared Function KSetMediaConfig2(ByVal h As System.IntPtr, ByRef MediaConfig As structural_MEDIA_CONNECTION_CONFIG2) As Boolean
End Function