读书人

关于 C# 调用 VC DLL !分不够可加!

发布时间: 2012-05-21 18:04:41 作者: rapoo

关于 C# 调用 VC DLL 在线等!!!分不够可加!!!
数据结构
typedef struct _NET_CONNECT_STRUCT
{
DWORD SrcIP;
int SrcSlot;
int SrcPort;
DWORD DesIP;
int DesSlot;
int DesPort;
DWORD MulAddr;
long MulPort;
int Mode;
int Prior;
int Param;
long ServerPort;
long ClientPort;
}NET_CONNECT_STRUCT,*PNET_CONNECT_STRUCT;
参数说明:
SrcIP: 4字节,视频源IP地址,网络字节序;
SrcSlot: 4字节,视频源槽位号,1-16;
SrcPort: 4字节,视频源端口号,1-16;
DesIP: 4字节,接收端IP地址,网络字节序;
DesSlot: 4字节,接收端槽位号,1-16;
DesPort: 4字节,接收端端口号,1-16;
MulAddr: 4字节,多播地址,多播方式时用于设置多播地址,设为0时系统自动生成多播地址;
MulPort: 4字节,备用;
Mode: 4字节,数据流传输模式,0-单播,1-多播;
Prior: 4字节,连接权限,用户连接的权限;(现在系统内部默认为:权限组=0,优先级=8,请设置为:0x00000000)
Param: 4字节,连接参数,数据源采用的参数,在系统设置的参数表中选定;
ServerPort: 4字节,视频源的指令端口;
ClientPort: 4字节,备用。

音视频接口函数

4.1 初始化SDK
int AVT_NET_Init(char *pAddr);
pAddr:用于接收数据流的网卡IP地址,字符串格式如:“192.168.1.1”;
返回值:初始化成功返回0,否则返回非0。

4.2 释放SDK
void AVT_NET_Release();

4.3 获取KeyColor
DWORD AVT_NET_GetKeyColor()
返回值:KeyColor,RGBA格式,用于设置显示窗口的背景色。

4.4 设置KeyColor
int AVT_NET_SetKeyColor(DWORD rgb);
rgb: KeyColor,格式为RGBA;
返回值: 调用成功返回0,否则非0。

4.5 获取错误码
int AVT_NET_GetLastError();
返回值: 错误码。

4.6 建立到本机(PC)的视频连接
HANDLE AVT_NET_Open(PNET_CONNECT_STRUCT ncs);
ncs: NET_CONNECT_STRUCT结构指针;
返回值: 建立连接成功返回连接句柄,必须保存连接句柄以调用其它功能接口;失败则返回NULL,可调用AVT_NET_GetLastError接口函数来获得错误码。
需要注意的参数:
ServerPort: 设为40000,暂定为固定值;
DesIP: 本机IP,网络字节序;
DesSlot及DesPort:用于判断本地的接收端口,每路视频连接具有不同的组合;
MulAddr: 单播连接时不需要设置该参数,多播时设为0则由系统自动生成多播IP。



以下我的调用 报连接失败!!!

//注册SN
[DllImport("avt_net.dll", CharSet = CharSet.Ansi)]
public static extern int AVT_NET_SetLicence(string pSN);

//初始化SDK
[DllImport("avt_net.dll", CharSet = CharSet.Ansi)]
public static extern int AVT_NET_Init(string pAddr);

//释放SDK
[DllImport("avt_net.dll", CharSet = CharSet.Ansi)]
public static extern void AVT_NET_Release();

//获取KeyColor
[DllImport("avt_net.dll", CharSet = CharSet.Ansi)]
public static extern uint AVT_NET_GetKeyColor();

//设置KeyColor
[DllImport("avt_net.dll", CharSet = CharSet.Ansi)]
public static extern int AVT_NET_SetKeyColor(uint rgb);
//rgb: KeyColor,格式为RGBA

//获取错误码
[DllImport("avt_net.dll", CharSet = CharSet.Ansi)]
public static extern int AVT_NET_GetLastError();
//返回值: 错误码

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
public struct PNET_CONNECT_STRUCT
{
public uint SrcIP;
public int SrcSlot;
public int SrcPort;
public uint DesIP;
public int DesSlot;
public int DesPort;
public uint MulAddr;
public int MulPort;
public int Mode;
public int Prior;
public int Param;
public int ServerPort;
public int ClientPort;
}

//建立到本机(PC)的视频连接
[DllImport("avt_net.dll", CharSet = CharSet.Ansi)]
public static extern IntPtr AVT_NET_Open(ref PNET_CONNECT_STRUCT ncs);
//ncs: NET_CONNECT_STRUCT结构指针;
//返回值: 建立连接成功返回连接句柄,必须保存连接句柄以调用其它功能接口;
// 失败则返回NULL,可调用AVT_NET_GetLastError接口函数来获得错误码。
//需要注意的参数:
//ServerPort: 设为40000,暂定为固定值;
//DesIP: 本机IP,网络字节序;
//DesSlot及DesPort:用于判断本地的接收端口,每路视频连接具有不同的组合;
//MulAddr: 单播连接时不需要设置该参数,多播时设为0则由系统自动生成多播IP。

//显示图像
[DllImport("avt_net.dll", CharSet = CharSet.Ansi)]
public static extern int AVT_NET_Draw(IntPtr hand, IntPtr winhand);


//hand: 调用AVT_NET_Open或AVT_NET_RecordOpen接口时返回的句柄;
//winhand: 用来显示图像的窗口句柄,该窗口的背景色必须设为KeyColor才能显示图像,可以调用GetKeyColor接口获得KeyColor;
//返回值: 调用成功返回0,否则非0。可调用AVT_NET_GetLastError 接口函数来获得错误码。

public static UInt32 IP2Int(string ipStr)
{
string[] ip = ipStr.Split('.');
uint ipCode = 0xFFFFFF00 | byte.Parse(ip[3]);
ipCode = ipCode & 0xFFFF00FF | (uint.Parse(ip[2]) << 0x8);
ipCode = ipCode & 0xFF00FFFF | (uint.Parse(ip[1]) << 0x10);
ipCode = ipCode & 0x00FFFFFF | (uint.Parse(ip[0]) << 0x18);
return ipCode;
}

public static Color UIntToColor(uint color)
{
byte a = (byte)(color >> 24);
byte r = (byte)(color >> 16);
byte g = (byte)(color >> 8);
byte b = (byte)(color >> 0);
return Color.FromArgb(a, r, g, b);
}

private void button1_Click(object sender, EventArgs e)
{
AVT_NET_SetLicence("AAAAAAA");
AVT_NET_Init("192.168.2.44");
uint mycolor = AVT_NET_GetKeyColor();
AVT_NET_SetKeyColor(mycolor);
PNET_CONNECT_STRUCT pcs = new PNET_CONNECT_STRUCT();
//视频源IP地址
pcs.SrcIP = IP2Int("192.168.12.215");
//视频源槽位号,1-16
pcs.SrcSlot = 1;
//视频源端口号,1-8;
pcs.SrcPort = 1;
//接收端IP地址
pcs.DesIP = IP2Int("192.168.2.44");
//接收端槽位号,1-16;
pcs.DesSlot = 1;
//接收端端口号,1-16;
pcs.DesPort = 1;
//多播地址,多播方式时用于设置多播地址,设为0时系统自动生成多播地址;
pcs.MulAddr = 1;
//备用
pcs.MulPort = 0;
//数据流传输模式,0-单播,1-多播;
pcs.Mode = 0;
//连接权限,用户连接的权限;(现在系统内部默认为:权限组=0,优先级=8,请设置为:0x00000000)
pcs.Prior = 255;
//连接参数,数据源采用的参数,在系统设置的参数表中选定;
pcs.Param = 0;
//视频源的指令端口;
pcs.ServerPort = 40000;
//备用。
pcs.ClientPort = 0;

IntPtr myhand = AVT_NET_Open(ref pcs);
this.Text = AVT_NET_GetLastError().ToString();

this.pictureBox1.BackColor = UIntToColor(mycolor);
AVT_NET_Draw(myhand, this.pictureBox1.Handle);
//this.pictureBox1.BackColor = Color.Black;
}

[解决办法]
这样调用太复杂了,把C++DLL做成ATLCOM接口库,引入到C#中,自动生成调用接口。
[解决办法]
楼上强大。学习了
[解决办法]

读书人网 >C++

热点推荐