注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

还东国的博客

行之苟有恒,久久自芬芳

 
 
 

日志

 
 

C#调用C++DLL的小总结7---C++Dll中二级指针的问题  

2013-05-15 11:06:14|  分类: NET(C#) |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

C#调用C++DLL的小总结7---C++Dll中二级指针的问题

有的时候儿,在C++DLL中不可避免的要使用二级指针或者说是二维数组,当然,大家要竭力避免使用这种情况,毕竟C#中操作指针的数据有什么偶然情况大家都是无法预料的。

所以还是要对操作二级指针有一定的方法,正如古人说得好:“凡事预则立,不预则废”。

举一个简单的例子:

C++DLL

extern "C" __declspec(dllexport) int __stdcall

testName(char** name, int len)

那么在C#端如何设置数据的格式呢?目前知道的有两种方法:

1、使用string[]

网上一些资料说,数据量小可以使用这个,但大于80个字符以上用下面的第二种方法,因为目前还没有超过这个数字的长度的数组,所以暂时没有办法测试。具体的方法见代码:

 [DllImport("xxx.dll")]

public static extern bool testName(string[] name, int len);

2、使用byte[]:

有的人会问了,不是一级指针使用这个么,为什么二级指针还用这个,这个还真说不清楚,不过大家都明白,所谓一二级的指针其实是都可以互相通过一定的方式来访问的,特别是在多维数组方面,大家如果有什么疑问可以看C++相关的书籍。

见下面代码:这个例程转自

http://blog.csdn.net/xiaogelee/article/details/1916716

C++ DLL接口:

long _stdcall USE_GetAgentGroupInfoEx(
/* [in] */ char** AgentID,
/* [in] */ long ArraySize,
/* [out] */ char** AgentName,
/* [out] */ long AgentStatus[],
/* [out] */ char** AgentDN,
/* [out] */ char** AgentIP);

C#中的声明

[DllImport("ProxyClientDll")]
public static extern int USE_GetAgentGroupInfoEx
(
/*[in]*/ char[] allAgentID,
/*[in]*/ int agentCount,
/*[out]*/ byte[] AgentName,
/*[out]*/ int[] AgentStatus,
/*[out]*/ byte[] AgentDN,
/*[out]*/ byte[] AgentIP
);

C#中的调用:

Encoding encode = Encoding.Default;
byte[] tAgentID;
byte[] tAgentName;
int[] tAgentStatus;
byte[] tAgentDN;
byte[] tAgentIP;

int rslt = -1;
int agentCount;

//agentID:是个外部定义的string[]类型变量
//AgentName:
是个外部定义的string[]类型变量
//AgtIDLength:
C++ DLL中定义的存放AgtIDchar[]的长度
//AgtNameLength:
C++ DLL中定义的存放AgtNamechar[]的长度
//AgtDNLength:
C++ DLL中定义的存放AgtDNchar[]的长度
//AgtIPLength:
C++ DLL中定义的存放AgtIPchar[]的长度

if (agentID.Length > 0)
{
agentCount = agentID.Length;
tAgentID = new byte[AgtIDLength * agentCount];
tAgentName = new byte[AgtNameLength * agentCount];
tAgentStatus = new int[agentCount];
tAgentDN = new byte[AgtDNLength * agentCount];
tAgentIP = new byte[AgtIPLength * agentCount];
for( int i = 0; i < agentCount; i ++ )
{
encode.GetBytes(agentID[i]).CopyTo(tAgentID,i*AgtIDLength);
}
rslt = USE_GetAgentGroupInfoEx(encode.GetChars(tAgentID),agentCount,
tAgentName, tAgentStatus, tAgentDN, tAgentIP);

if( rslt == 0 )
{
for( int i = 0; i < agentCount; i ++ )
{
AgentName[i] = encode.GetString(tAgentName,i*AgtNameLength,AgtNameLength);
//……
}
}
}
转载完毕

细节决定成败,该注意的细节一定不能忽略。

  评论这张
 
阅读(911)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017