Delphi & C++ POS 与 DLL 的通信

Delphi & C++ POS communication with DLL

本文关键字:DLL 通信 POS C++ Delphi      更新时间:2023-10-16

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

在我发送命令"F0"(打印机状态)后,在c++应用程序中,答案是:060052000001000000018400000003ae51452020524d2033333033833322020202031352e30382e323031332031343a3330

在我发送命令"F0"(打印机状态)后,在delphi应用程序中的答案是:䁘

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))  

现在所有的工作葡萄酒。

提前感谢!

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导出一个解除分配程序,或者内存是静态分配的。