c#调用DLL中char*应该怎么调用

dezhengwei 2010-01-29 02:37:37
[DllImport("ICcard_dll.dll",CharSet=CharSet.Ansi)]
public static extern int Init_com(char* set);

我用
[DllImport("ICcard_dll.dll",CharSet=CharSet.Ansi)]
public static extern int Init_com(string set);
string StrConnect="1,9600,N,8,4";
iret = Init_com(StrConnect);

这样用
[DllImport("ICcard_dll.dll",CharSet=CharSet.Ansi)]
public static extern int Init_com(ref char set);
string StrConnect="1,9600,N,8,4";
要怎么把string数据在c#中表示成char*呢?
这样会说参数出错。
我该怎么用呢,高手救命啊!
...全文
4156 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
holyrong 2010-07-29
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 dezhengwei 的回复:]
谢谢大家,问题解决了,大家说的很详细。
[/Quote]

怎么解决的?
dezhengwei 2010-01-29
  • 打赏
  • 举报
回复
谢谢大家,问题解决了,大家说的很详细。
mjp1234airen4385 2010-01-29
  • 打赏
  • 举报
回复
我同意9楼的意见。
bamboo2000 2010-01-29
  • 打赏
  • 举报
回复
给你个例子:
[DllImport("Del_dll.dll")]
public static extern int GetStrLen();
[DllImport("Del_dll.dll")]
public static extern bool UCase(System.Text.StringBuilder str);

其中Delphi源码为:
function GetStrLen(str:Pchar): integer; stdcall;
begin
Result := Length(str);
end;

function UCase(str:PChar): boolean; stdcall;
var
s: string;
begin
s:=Uppercase(strPas(str));
CopyMemory(str,pchar(s),Length(s));
result:=true;
end;

调用:
int len = GetStrLen("abcdefg");
StringBuilder str2 = new StringBuilder("abcdefg hijklmn OPQRST uvwxyz");
if (UCase(str2)) {
...
}
yue_shanglin 2010-01-29
  • 打赏
  • 举报
回复
刚才经过测试,发现char*这种数据类型可以直接用string来做,例如

这样子来构建C#函数也是可以的,这里的数据类型不必和C++函数保持一致的

[DllImport("ICcard_dll.dll",CharSet=CharSet.Ansi)]
public static extern int Init_com(ref string set);
bamboo2000 2010-01-29
  • 打赏
  • 举报
回复
string 或者 System.Text.StringBuilder
如果不是 out 就是 string
如果 out 就用 System.Text.StringBuilder
yue_shanglin 2010-01-29
  • 打赏
  • 举报
回复
补充:C++函数都是通过char*和其他程序进行数据交换的,如果Init_com这个函数的原型是Init_com(char* )的话那么C#中也应该是char*
就该这样:
[DllImport("ICcard_dll.dll",CharSet=CharSet.Ansi)]
public static extern int Init_com(ref char* set);
int result = Init_com(ref str.ToCharArray());就OK
如果dll中的原型是Init_com(unsigned char* )的话,才是我上面说的那种
C++和C#数据类型的对应关系是char->char ;unsigned char ->byte
yue_shanglin 2010-01-29
  • 打赏
  • 举报
回复
如果ICcard_dll.dll这里面的参数是char*的话,那么你可以这样做:
[DllImport("ICcard_dll.dll",CharSet=CharSet.Ansi)]
public static extern int Init_com(ref byte* set);
例如:
string strbuffer = "test";//测试字符串
int result = Init_com(ref Syste.Encoding.Ascii.GetBytes(strbuffer));
这样调用函数就可以了
wanghui0380 2010-01-29
  • 打赏
  • 举报
回复
关键问题是:这个char* 是否需要修改,是否out

不out的,可以直接用string 或char[]

out的使用StringBuilder或intptr
真相重于对错 2010-01-29
  • 打赏
  • 举报
回复
那要看c++ 对这个参数的要求,如果是输出参数试试
intptr 或者 stringbuilder
dezhengwei 2010-01-29
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 michaelnami 的回复:]
public static extern int Init_com(string set);
[/Quote]
我这样用了的,还是不对啊,报参数出错了
michaelnami 2010-01-29
  • 打赏
  • 举报
回复
public static extern int Init_com(string set);

111,095

社区成员

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

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

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