请教C#重写C++ DLL中的方法。。

Spr_Perfei 2011-08-12 09:07:21
方法是这样的,先用CLIENT_GetNewDevConfig获取信息,out到缓冲区中char szOutBuffer[32*1024] = {0};,然后再用CLIENT_ParseData方法,转换为对应的结构体。


SDK这样说明的。

CLIENT_GetNewDevConfig
获取配置,按照字符串格式

BOOL CLIENT_GetNewDevConfig(
LONG lLoginID,
char *szCommand,
int nChannelID,
char *szOutBuffer,
DWORD dwOutBufferSize,
int *error,
int waittime=500,
);
Parameters
[in]lLoginID:CLIENT_Login的返回值
[in]szCommand:命令参数,"VideoAnalyseGlobal" 视频分析全局配置,对应结构体CFG_ANALYSEGLOBAL_INFO
[in]nChannelID:通道号
[out]szOutBuffer:输出缓冲
[out]dwOutBufferSize:输出缓冲大小
[out]error:错误码
[in]waittime:等待超时时间
Return Values
成功返回TRUE,失败返回FALSE。
Remarks
获取配置,按照字符串格式,各个字符串包含的信息由CLIENT_ParseData解析。




CLIENT_ParseData
解析获取到的字符串配置信息

BOOL CLIENT_ParseData(
char *szCommand,
char *szInBuffer,
LPVOID lpOutBuffer,
DWORD dwOutBufferSize,
void* pReserved
);

Parameters
[in]szCommand:命令参数,如表所示 "VideoAnalyseGlobal" 视频分析全局配置,对应结构体CFG_ANALYSEGLOBAL_INFO
[in]szInBuffer:输入缓冲,字符配置缓冲
[out]lpOutBuffer:输出缓冲,结构体类型可以参见上表
[out]dwOutBufferSize:输出缓冲的大小
[in]pReserved:保留参数
Return Values
成功返回TRUE,失败返回FALSE。
Remarks
此接口配合CLIENT_GetNewDevConfig使用,在使用CLIENT_GetNewDevConfig获取字符串配置信息后,使用此接口从配置信息中提取想要的信息。


CFG_ANALYSEGLOBAL_INFO 是结构体


C++事例代码
int nErr = 0;
char szOutBuffer[32*1024] = {0};
//视频分析全局结构体;
CFG_ANALYSEGLOBAL_INFO stuAnalysGlobalInfo = {0};

// get global info
BOOL bSuccess = CLIENT_GetNewDevConfig(m_lLoginID, "VideoAnalyseGlobal", 0, szOutBuffer, 32*1024, &nErr,3000);
if (bSuccess)
{
int nRetLen = 0;
BOOL bRet = CLIENT_ParseData("VideoAnalyseGlobal", szOutBuffer, (char*)&stuAnalysGlobalInfo, sizeof(CFG_ANALYSEGLOBAL_INFO), &nRetLen);
if (bRet == FALSE)
{
MessageBox("Parser data error", "Prompt");
return FALSE;
}





我拿C#重写的,public bool CLIENT_GetNewDevConfig(
int lLoginID,
String szCommand,
int nChannelID,
ref StringBuilder[] szOutBuffer(char[]、Stringbuilder、String 都试过),
double dwOutBufferSize(int ushort 也都试过),
ref int error,
int waittime,
);

可以正常返回True,错误码也正常,但是out的szOutBuffer是null,不太明白这个参数应该怎么重写,是不是应该写成数组。
求教各位。。。
谢谢了
...全文
387 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
足球中国 2011-08-16
  • 打赏
  • 举报
回复
好象是内定的规则。
看过一个解释不过也没解释的太清楚。
Spr_Perfei 2011-08-16
  • 打赏
  • 举报
回复
谢谢各位, 已经解决了。

byte[] szOutBuffer, 去掉ref,

但是 不太明白,为什么要去掉ref呢?
gomoku 2011-08-12
  • 打赏
  • 举报
回复
byte[] szOutBuffer,

szOutBuffer = new byte[32*1024];
CLIENT_GetNewDevConfig(...,szOutBuffer,...);
CLIENT_ParseData("VideoAnalyseGlobal", szOutBuffer,...);

杨友山 2011-08-12
  • 打赏
  • 举报
回复
如果你的电脑是32位:
LONG lLoginID, ---Int32 lLoginID
char *szCommand,---Int32 szCommand,这个是地址,在c#中,你要看偏移量,也就是据开头多少字节。
int nChannelID,---Int32 nChannelID
char *szOutBuffer,同2
DWORD dwOutBufferSize, 数组,是存放缓存的,c#中可能用不到
int *error,---Int32
int waittime=500, ----Int32

其实抓住本质就行,不能一句一句的转换。
honkerhero 2011-08-12
  • 打赏
  • 举报
回复
去掉ref, 直接使用stringBuilder

111,097

社区成员

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

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

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