德尔福&与DLL的C ++ POS通信

时间:2013-08-15 12:45:09

标签: c++ delphi

我正在努力使我的财务打印机在没有用c ++编写的“驱动程序”的情况下工作,并与文件通信。我想避免这种情况,并使用dll文件直接与财务打印机进行通信。

发送命令“F0”(打印机状态)后,在c ++ app中答案是: 060052000001000000018400000003AE5145202020524D20333330393833322020202031352E30382E323031332031343A3330

发送命令“F0”(打印机状态)后,在delphi app中答案是: 䁘

c ++代码:

extern "C" __declspec(dllimport) char* __stdcall TransmitPrinterCommand(int IPCom, char* Port, int BaudRateNr, char* Command);
cprt = TransmitPrinterCommand(0, cp.c_str(), StrToInt(Baud), EditCommand->Text.c_str());

if (cprt.Length() == 2)
    { ... error

delphi代码:

function TransmitPrinterCommand(IPCom:integer; Port:AnsiString; BaudRateNr:integer; Command:AnsiString):WideChar;
     stdcall; external 'QPrintFM.dll';
...
procedure TForm1.Button1Click(Sender: TObject);
var
  cprt:WideChar;
begin
  cprt:=TransmitPrinterCommand(0,AnsiString('COM2'), 9600, AnsiString(txtKomanda.Text));
  txtRez.Text:=cprt;
end;

编辑3
正如Re0sless建议我更改了代码:

function TransmitPrinterCommand(IPCom:integer; Port:AnsiString; BaudRateNr:integer; Command:AnsiString):PAnsiChar;
stdcall; external 'QPrintFM.dll';

cprt:=TransmitPrinterCommand(0,AnsiString('COM2'), 9600, AnsiString(txtKomanda.Text))  

现在所有的作品都是葡萄酒。

提前致谢!

1 个答案:

答案 0 :(得分:3)

C ++函数的Delphi转换是错误的。您不能跨DLL边界使用托管Delphi字符串。相当于char *的Delphi,指向以null结尾的char数组的指针是PAnsiChar。

你需要:

function TransmitPrinterCommand(
  IPCom: Integer; 
  Port: PAnsiChar; 
  BaudRateNr: Integer; 
  Command: PAnsiChar
): PAnsiChar; stdcall; external 'QPrintFM.dll';

这样称呼:

cprt := TransmitPrinterCommand(
  0,
  'COM2', 
  9600,
  PAnsiChar(AnsiString(txtKomanda.Text))
);

我不确定解除函数返回值的协议是什么。那是你应该仔细检查的东西。你无法解除分配,所以DLL导出一个解除分配器,或者内存是静态分配的。