ç»è¿å¾å¤å°è¯, Delphi/pascalæ æ³å°array of integerè¿æ ·çæ°ç»è¿åç»C#,åªè½ä¼ æ°ç»çå°åè¿å», C#以IntPtrç±»åçåæ°æ¥æ¶, ç¶åéè¿Marshalå°æéææçå 容å¤å¶åºæ¥Â
  delphiçdll声æ:
function dumpRegisters(out pvOut: PInteger; out pvSize: word): boolean; stdcall;export;
begin
sendDebug('dumpRegisters.');
result:=false;
if (gdm=nil) then begin
sendDebug('dumpRegisters, failed');
exit;
end;
pvOut:[email protected][0];
pvSize:=length(gdm.FRegisterValues);
result:=true;
sendDebugFmt('dumpRegisters, OK, out:%p, size:%d',[pvOut,pvSize]);
end;
C#çimport声æ:
public static extern void setRoutines(IntPtr pvRoutines);
[DllImport("modbusapi.dll", EntryPoint = "dumpRegisters", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
public static extern byte dumpRegisters(out IntPtr pvAddr,
out UInt16 pvSize);
ç¶åéè¿è¿ä¸ªå½æ°è½¬æ¢:
public static int[] IntPtr2RegisterData(IntPtr pvAddr,ushort pvSize)
{
int[] lvRegisters = new int[pvSize];
Marshal.Copy(pvAddr, lvRegisters,0, pvSize);
return lvRegisters;
}
ä¾å:
IntPtr lvPtr;
ushort lvSize;
int[] lvRet = null;
if (ModBus.dumpRegisters(out lvPtr, out lvSize) != 0)
lvRet = ModBus.IntPtr2RegisterData(lvPtr, lvSize);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < lvSize; i++)
{
sb.Append(String.Format("Register:{0}, value: {1}\r\n", i, lvRet[i]));
}
textBox1.AppendText(sb.ToString());
}
====================
èç¨VCè°ç¨,åå¯ä»¥åå°æ ç¼è¿æ¥,ç´æ¥å¼ç¨æé:
å®ä¹functionæé:
typedef bool(__stdcall* _dumpRegisters)(PINT&, WORD&);
bool ModBus::readRegisters(PINT& pvOut, WORD& pvSize) {
if (mHnd == 0) return false;
//_dumpRegisters dumpRegisters = (_dumpRegisters)GetProcAddress(mHnd, "dumpRegisters");
_dumpRegisters dumpRegisters = (_dumpRegisters)GetProcAddress(mHnd, "dumpRegisters");
WORD lvSize = 0;
PINT lvAddr = NULL;
if (dumpRegisters(lvAddr, lvSize)) {
pvOut = lvAddr;
pvSize = lvSize;
}
}
è°ç¨:
PINT lvRegisters = NULL;
WORD lvSize = 0;
char lvOut[1024*10];
int lvLen = 0;
if (modbus.readRegisters(lvRegisters, lvSize)) {
for (int i = 0; i < lvSize; i++) {
try {
lvLen += sprintf_s(lvOut + lvLen, 1024 * 10 - lvLen, "Register:%d, Value:%d \r\n", i, lvRegisters[i]);
}
catch (const std::exception& e)
{
}
}
CString lvT(lvOut);
ed_log.SetWindowTextW(lvT);
}
ä¸è¿°æ¹æ³åºè¯¥äºå åå¨dlléé¢ç®¡ççæ åµ, å¦æå ååå¨ä¸»ç¨åºéé¢å ç³è¯·ç,è°ç¨å¦ä¸ :
dll 代ç :
function dumpRegisters(pvOut: PInteger; out pvSize: word): boolean; stdcall;export;
begin
sendDebug('dumpRegisters.');
result:=false;
if (gdm=nil) then begin
sendDebug('dumpRegisters, failed');
exit;
end;
//pvOut:[email protected][0];
pvSize:=length(gdm.FRegisterValues);
sendDebugFmt('dumpRegisters, source addr:%p, target addr:%p,size:%d',[@gdm.FRegisterValues[0],pvOut,pvSize]);
sendDebugFmt('before size:%d',[pvSize]);
move(gdm.FRegisterValues[0],pvOut^,sizeof(Integer)*pvSize); //å¤å¶æ°æ®å°ä¸»ç¨åºçå
åpvOut
sendDebugFmt('after size:%d',[pvSize]);
result:=true;
sendDebugFmt('dumpRegisters, OK, out:%p, size:%d',[pvOut,pvSize]);
end;
VCçè°ç¨:
typedef bool(__stdcall* _dumpRegisters)(PINT, WORD&);
_dumpRegisters dumpRegisters = (_dumpRegisters)GetProcAddress(mHnd, "dumpRegisters");
PINT lvAddr = NULL;
mRegisterSize = mRoutines->getRegisterSize();
PINT mRegisters = new int[mRegisterSize];
dumpRegisters(mRegisters, pvSize); .....delete [] mRegisters;
C#çè°ç¨:
[DllImport("modbusapi.dll", EntryPoint = "dumpRegisters", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
private static extern byte dumpRegisters([In, Out]
[MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)] int[] pvAddr,
out UInt16 pvSize);
UInt16 lvSize = routines.getResiterSize();
int[] registers = new int[lvSize];
dumpRegisters(registers, out lvSize);