delphi中:
函数定义:
function SeekCard(var CardType: Byte; CardSN: Pointer; var BufSize: Integer): Boolean; stdcall; external ERTransDLL;
函数调用:
var
sn: array[0..16] of Char;
nLen: Integer;
aCardType: Byte;
begin
if SeekCard(aCardType, @sn, nLen) then
memo1.Lines.Add('寻卡成功 ' + sn+ ' 卡类型 '+ intToStr(aCardType))
else memo1.Lines.Add('寻卡失败,错误代码 '+IntToStr(GetLastTradeError));
end;
转换到.net中:
[DllImport(ERTransDLL, CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Winapi)]
public static extern bool SeekCard(ref byte CardType, object CardSN, ref int BufSize);
char[] sn = new char[16 + 1];
static int nLen = 0;
static byte aCardType = 0;
private void btnConnectReader_Click(object sender, EventArgs e)
{
if (SeekCard(ref aCardType,sn, ref nLen))
{
tssMessage.Text = "寻卡成功 " + sn + " 卡类型 " + (aCardType).ToString();
}
异常:{"尝试读取或写入受保护的内存。这通常指示其他内存已损坏。"}
会不是delphi中的 Pointer转换成object的问题,我也试过用intptr的,会出现栈溢出异常
object CardSN 这样肯定不行。试试StringBuilder吧,估计也要加ref。好久没玩delphi转C#了,不确定啊。
stringbuilder,Intptr我都试过,不行的,不过现在已经解决了,我把项目从.net4转到3.5就OK了,究其原因不懂,有了解的朋友可以帮忙解释下原因