C# 调用 C++ DLL 问题
1. 函 数CameraInit原型:DT_API DS_CAMERA_STATUS CameraInit(
DS_SNAP_PROC pCallbackFunction,
IN DS_RESOLUTION uiResolution,
IN HWND hWndDisplay,
IN LPVOID lpThreadparam );
功能: 初始化视频设备
参数: pCallbackFunction 回调函数指针
uiResolution 解析度索引
hWndDisplay 视频显示控件句柄
lpThreadparam 视频流线程创建地址
返回值: 调用成功返回STATUS_OK 否则返回错误代码
红色参数该如何在C#中解决,这个参数我使用VirtualAllocEx或Marshal类创建内存给出首地址都不好使。
这是一个数字相机的SDK。 c++ 视频流 视频 线程 --------------------编程问答-------------------- http://bbs.csdn.net/topics/360156598
http://bbs.csdn.net/topics/360100619 --------------------编程问答-------------------- 我要问的是最后一个参数在C#中该怎么写, lpThreadparam 在C#中怎么创建 --------------------编程问答-------------------- byte[] --------------------编程问答-------------------- LPVOID最常用的有两种情况,一种就是表示一个内存块,另一种情况可能是根据其它参数的定义指向不同的数据结构。
第一种情况很好处理,如果是一个内存块,我们可以他当作一个Byte数组就可以了,例如:
///<summary>
/// 形:BOOL ReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped);
///</summary>
[DllImport("kernel32.dll")]
public extern static Int32 ReadFile(IntPtr hFile, Byte[] buffer,Int32 nNumberOfBytesToRead, ref Int32 lpNumberOfBytesRead, ref OVERLAPPED lpOverlapped);
/**/
第二种情况比较复杂,C#中类型转换是有限制的,一个Int32是没法直接转换成为
Point的,这个时候之能够根据不同的参数类型定义不同的重载函数了。例如GetProcAddress函数的lpProcName既可以是一个字符串
表示函数名,又可以是一个高字为0的Int32类型,表示函数的序号,我们可以这样分别定义:
///<summary>
///原型是: FARPROC GetProcAddress(HMODULE hModule,LPCSTR lpProcName);
///</summary>
[DllImport("kernel32.dll", EntryPoint = "GetProcAddress")]
private extern static IntPtr GetProcAddress(IntPtr hModule, String sFuncName);
[DllImport("kernel32.dll", EntryPoint = "GetProcAddress")]
private extern static IntPtr GetProcAddressByIndex(IntPtr hModule, Int32 dwIndex);/** --------------------编程问答--------------------
天知道,这个看你的库的具体约定了。
补充:.NET技术 , C#