这是delphi一个函数,我写了一个申明调用时提示尝试读取或写入受保护的内存。这通常指示其他内存已损坏
//function GetMessageStr( iAddr :Cardinal; sStr :PChar ) :Integer;
// stdcall; export;
[DllImport("ANLOCK_2009.dll")]
public static extern int GetMessageStr( uint iAddr,ref string sStr);
//function GetMessageStr( iAddr :Cardinal; sStr :PChar ) :Integer;
// stdcall; export;
[DllImport("ANLOCK_2009.dll")]
public static extern int GetMessageStr( uint iAddr,ref string sStr);
//function GetMessageStr( iAddr :Cardinal; sStr :PChar ) :Integer;
// stdcall; export;//C#:声明调用
[DllImport("ANLOCK_2009.dll")]
public static extern int GetMessageStr( uint iAddr,ref string sStr);
//
string temp = "";
uint u_iAddr = 1;
ANLOCK_2009.GetMessageStr(u_iAddr, ref temp);
//返回指针字符串
function GetMessageStr( iAddr :Cardinal; sStr :PChar ) :Integer;
external 'ANLOCK_2009.dll'; stdcall;sStr :PChar 这是一个指针字符串
不知道这个DLL规定怎么释放返回的内存,不释放的话会有内存泄漏的。
//返回指针字符串
function GetMessageStr( iAddr :Cardinal; sStr :PChar ) :Integer;
external 'ANLOCK_2009.dll'; stdcall;procedure TfrmDemo.CommWndProc( var msg: TMessage );
var
cCardInfo :PChar;
begin
case msg.msg of
WM_DEVICECHANGE://当发卡器连接异常
OpenMac(False); //这里实现自动打开
PWM_CARDVAILD:
begin
GetMem(cCardInfo,250);
try
GetMessageStr(msg.lParam, cCardInfo);
lstCardInfo.Items.CommaText := StrPas(cCardInfo);
finally
FreeMem(cCardInfo);
end;
end;
PWM_CARDNOVAILD:
lstCardInfo.Items.Text := '卡片无效';
PWM_WRITEFAIL:
ShowMessage('写卡失败');
PWM_GETSYSCODE:
ShowMessage('系统授权成功');
PWM_GETREADERDATA:
begin
GetMem(cCardInfo,800);
try
GetMessageStr(msg.lParam, cCardInfo);
finally
FreeMem(cCardInfo);
end;
end;
end;
end;
或者你用byte[]试试,也要分配内存
//C#:声明调用
[DllImport("ANLOCK_2009.dll")]
public static extern int GetMessageStr( uint iAddr,ref string sStr);
//
string temp = "";
uint u_iAddr = 1;
ANLOCK_2009.GetMessageStr(u_iAddr, ref temp);ANLOCK_2009.GetMessageStr(u_iAddr, ref temp);,直接GetMessageStr(u_iAddr, ref temp)好了
给个例子:
[DllImport("ITMonitor")]
private static extern uint NotifyException(byte[] sException, int iSeverity, int ExceptionType);string sWarning = "test";
byte[] bytWarning = new byte[sWarning.Length + 1];
bytWarning = System.Text.Encoding.ASCII.GetBytes(sWarning);//string to byte array
NotifyException(bytWarning, 1, 2);