C#调用VC写的DLL问题,急,在线等,问题解决,马上结贴

hjm1980_2007 2011-04-15 09:13:50
VC代码:
//视频数据回调函数
void __cdecl StreamDataProc(char *csFrontID, int iChannelNo, char *frameData, int frameLen, LPVOID callbackParam)
{
CClientDemoDlg* pClientDlg = (CClientDemoDlg*)callbackParam;

if (memcmp(pClientDlg->m_csFrontID, csFrontID, VS_FRONTID_LEN) == 0 && pClientDlg->m_iChannelNo == iChannelNo)
{
PlaySDK_SendOneFrame(pClientDlg->m_hPlaySession, (unsigned char *)frameData, frameLen);
if (pClientDlg->m_bRecording)
{
AVRecord_sendOneFrame(pClientDlg->m_hRecHandle, frameData, frameLen);
}
else if (pClientDlg->m_bRec)
{
VSFrameHeader *pHeader = (VSFrameHeader*)frameData;
//注意,录像时的第一帧必须是I帧
if (pHeader->bIFrame)
{
//btl:自定义格式,文件后缀.gh;avi:avi格式,文件后缀.avi
pClientDlg->m_hRecHandle = AVRecord_create("btl");

char cFileName[1024];
memset(cFileName, 0, sizeof(cFileName));

sprintf(cFileName, "D:\\%s_%s_channel%d.gh",
pClientDlg->m_csFrontID, pClientDlg->GetCurDT(2), pClientDlg->m_iChannelNo);

AVRecord_setVideoFormat(pClientDlg->m_hRecHandle, C_FORMAT_H264,
pClientDlg->m_iImageWidth, pClientDlg->m_iImageHeight, pClientDlg->m_iFramerate);
AVRecord_setAudioFormat(pClientDlg->m_hRecHandle,
C_FORMAT_MP3, 1, 8000, 16, 16000);
AVRecord_setCallBackFun(pClientDlg->m_hRecHandle, NULL, NULL, 0);

AVRecord_setRecordFileName(pClientDlg->m_hRecHandle, cFileName);
AVRecord_start(pClientDlg->m_hRecHandle, 0x2, NULL);
AVRecord_sendOneFrame(pClientDlg->m_hRecHandle, frameData, frameLen);
pClientDlg->m_bRecording = TRUE;
pClientDlg->m_bRec = FALSE;
}
}
}
}

这些是VC定义:
typedef void far *LPVOID;
sprintf(定义)
#pragma warning(disable:4793)
__DEFINE_CPP_OVERLOAD_STANDARD_FUNC_0_1_ARGLIST(int, __RETURN_POLICY_SAME, _CRTIMP, sprintf, vsprintf, __out_z char, _Dest, __in_z __format_string const char *, _Format)

这些是调用VC的DLL:
PLAYSDK_API int WINAPI PlaySDK_SendOneFrame(HANDLE hPlayHandle, unsigned char *frameBuf, int frameLen);

AVRECORD_API void WINAPI AVRecord_sendOneFrame(HANDLE handle, void *data, unsigned long datalen);


AVRECORD_API void WINAPI AVRecord_setVideoFormat(HANDLE handle,unsigned short codec_id, unsigned long width, unsigned long height,unsigned short frameRate);

AVRECORD_API void WINAPI AVRecord_setAudioFormat(HANDLE handle,unsigned short codec_id, unsigned short channels, unsigned short sampleRate, unsigned short bitsPerSample, unsigned short bitRate);

AVRECORD_API void WINAPI AVRecord_setCallBackFun(HANDLE handle,DataStreamCallBack pFun, void *context, WORD nchannel);


AVRECORD_API int WINAPI AVRecord_setRecordFileName(HANDLE handle, const char *fileName);

AVRECORD_API BOOL WINAPI AVRecord_start(HANDLE handle, int recordFlag, BtlFileDate *tBtlFileDate);

AVRECORD_API void WINAPI AVRecord_sendOneFrame(HANDLE handle, void *data, unsigned long datalen);


这个回调函数,我现在要用C#实现,可我对VC一点都不会,特别是指针,不知道怎么去用C#实现

希望那位高手能帮我实现,非常谢谢!
...全文
140 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
jason成都 2011-04-20
  • 打赏
  • 举报
回复
果真悲剧,希望有专业人士专门讲解下这个问题,发现越来越多了。
小海贼 2011-04-20
  • 打赏
  • 举报
回复
IntPtr hwnd的化传入窗体Handle就是了
小海贼 2011-04-20
  • 打赏
  • 举报
回复
已第一个为例:
PLAYSDK_API int WINAPI PlaySDK_SendOneFrame(HANDLE hPlayHandle, unsigned char *frameBuf, int frameLen);
——————————————————————
[DllImport("DynamicDLL.dll", EntryPoint = "PlaySDK_SendOneFrame")]
public int extern PlaySDK_SendOneFrame(IntPtr hwnd,string str,int i)
也可以把他写成静态函数
dreamrising 2011-04-20
  • 打赏
  • 举报
回复
参数中没有C++的类对象还行,要是有类对象的话建议还是先用c++包装一层;要是结构体指针的话,首先得拿到c++定义的结构体,然后对应定义C#的结构体,否则也没法调用。
SQ09058022036 2011-04-20
  • 打赏
  • 举报
回复
类型转换得自己到网上去找相关的资料,很多博客上都有,你自己得一个函数一个函数的转换。
hjm1980_2007 2011-04-15
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 sq09058022036 的回复:]
其实C#调用C++ 的DLL文件很简单,首先自己建立一个专门用于调用dll文件接口函数的一个类,然后把System.Runtime.InteropServices;命名空间添加到类中,然后按照
[DllImport("DSCAMSDK.dll", EntryPoint = "CameraInit", CharSet = CharSet.Ansi, CallingConvention = Call……
[/Quote]

APi基本函数调用是没有问题,主有些函数类型不知道怎么替换还有指针方面,我为什么贴出这么详细的代码,就是因为有些不知道怎么用C#去实现和替换,所以很想有那位兄弟能我,真的真的非常感谢
SQ09058022036 2011-04-15
  • 打赏
  • 举报
回复
其实C#调用C++ 的DLL文件很简单,首先自己建立一个专门用于调用dll文件接口函数的一个类,然后把System.Runtime.InteropServices;命名空间添加到类中,然后按照
[DllImport("DSCAMSDK.dll", EntryPoint = "CameraInit", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
public static extern tagDS_CAMERA_STATUS CameraInit(dllfun_DS_SNAP_pROC pCallbackFunction, tagDS_RESOLUTION uiResolution, IntPtr hWndDisplay, UInt32 lpThreadparam);
的方式进行调用,当然C++和C#的数据类型是不一样的,你得根据dLL文件中函数的源码将C++的数据类型转换为C#的数据类型,网上有很多这方面的资料,如http://hi.baidu.com/%B3%C9%B6%BC%B9%FD%BF%CD/blog/item/c3b9ed897866d6d8fd1f10ae.html 写完这个类类后,在你的项目中就能像调用C#本身的库函数一样调用就行,当然如果dll中有回调函数(传说中的函数指针),你得在C#中用委托来处理。
hjm1980_2007 2011-04-15
  • 打赏
  • 举报
回复
对指针方面不太理解,还有一些定义
bdmh 2011-04-15
  • 打赏
  • 举报
回复
自己去查数据类型对照,unsigned char *这个可以用string代替,如果是结构体指针,可以用ref 结构体实例 来表示
hjm1980_2007 2011-04-15
  • 打赏
  • 举报
回复
怎么没有人回我呀,自己顶一下

110,502

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧