c# 调用 dephi 字符串传输
2016-03-23 16:35
453 查看
先吐槽一下,网上很多文章的问题却没有一个详细的解决方案的,而且百度了一堆都是问题,哎;
下面就来看下我的解决方案吧,希望对你有用:
1.先说下方式:
采用 c# StringBuilder 对应 dephi 的 Pointer
2.误区点:
c# : [DllImport("Sign_AnySignInterface.dll", CharSet = CharSet.Ansi // 这个地方必须为:Ansi 不然会乱码,这个折腾了好久
dephi: function Sign_AnySignGetInfo_ex(nInfolx :Integer ;qmxh :PChar ;memo :PChar; strInfo :Pointer ):Boolean ;stdcall; // strInfo 前面一定不要加 var,加了就无法返回结果
说完这些还是上代码最直接:
c# :
//静态反射
[DllImport("Sign_AnySignInterface.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall, EntryPoint = "Sign_AnySignVerifyData")]
public static extern Boolean Sign_AnySignVerifyData(int qmxh, StringBuilder memo, StringBuilder strInfo);
//调用反射
StringBuilder sbBuilder = new StringBuilder(1000000);
bool bl = AnySignMethods.Sign_AnySignVerifyData(int.Parse(qmxh), new StringBuilder(memo), sbBuilder);
strInfo = sbBuilder.ToString();
dephi:
定义:
function Sign_AnySignVerifyData(qmxh :Integer ;memo :PChar; strInfo :Pointer ):Boolean ;stdcall;
方法:
function Sign_AnySignVerifyData(qmxh :Integer ;memo :PChar; strInfo :Pointer ):Boolean ;stdcall;
var
b_ret :Boolean ;
strLog :string ;
strmeno:WideString;
strInfo1:WideString;
str,strlen:string;
pstr:PChar;
plen,i:Integer;
begin
Result :=False ;
while Char(strInfo^) <> #0 do
begin
str := str +string(Char(strInfo^));
inc(Integer(strInfo));
end;
str := ‘你的字符串’;
pstr:=PChar(str);
plen:=Length(str);
for i:=0 to plen do
begin
Char(strInfo^):=pstr[i];
inc(Integer(strInfo));
end;
Char(strInfo^):=#0;
Result :=True ;
end;
下面就来看下我的解决方案吧,希望对你有用:
1.先说下方式:
采用 c# StringBuilder 对应 dephi 的 Pointer
2.误区点:
c# : [DllImport("Sign_AnySignInterface.dll", CharSet = CharSet.Ansi // 这个地方必须为:Ansi 不然会乱码,这个折腾了好久
dephi: function Sign_AnySignGetInfo_ex(nInfolx :Integer ;qmxh :PChar ;memo :PChar; strInfo :Pointer ):Boolean ;stdcall; // strInfo 前面一定不要加 var,加了就无法返回结果
说完这些还是上代码最直接:
c# :
//静态反射
[DllImport("Sign_AnySignInterface.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall, EntryPoint = "Sign_AnySignVerifyData")]
public static extern Boolean Sign_AnySignVerifyData(int qmxh, StringBuilder memo, StringBuilder strInfo);
//调用反射
StringBuilder sbBuilder = new StringBuilder(1000000);
bool bl = AnySignMethods.Sign_AnySignVerifyData(int.Parse(qmxh), new StringBuilder(memo), sbBuilder);
strInfo = sbBuilder.ToString();
dephi:
定义:
function Sign_AnySignVerifyData(qmxh :Integer ;memo :PChar; strInfo :Pointer ):Boolean ;stdcall;
方法:
function Sign_AnySignVerifyData(qmxh :Integer ;memo :PChar; strInfo :Pointer ):Boolean ;stdcall;
var
b_ret :Boolean ;
strLog :string ;
strmeno:WideString;
strInfo1:WideString;
str,strlen:string;
pstr:PChar;
plen,i:Integer;
begin
Result :=False ;
while Char(strInfo^) <> #0 do
begin
str := str +string(Char(strInfo^));
inc(Integer(strInfo));
end;
str := ‘你的字符串’;
pstr:=PChar(str);
plen:=Length(str);
for i:=0 to plen do
begin
Char(strInfo^):=pstr[i];
inc(Integer(strInfo));
end;
Char(strInfo^):=#0;
Result :=True ;
end;