0

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

在我发送命令“F0”(打印机状态)后,在 C++ 应用程序中的答案是:060052000001000000018400000003AE5145202020524D20333330393833322020202031352E30382E323031332031343A3330

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

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

德尔福代码:

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

现在一切正常的酒。

提前致谢!

4

1 回答 1

3

C++函数的Delphi翻译是错误的。不能跨 DLL 边界使用托管 Delphi 字符串。Delphi 等价于 char*,指向以 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 导出解除分配器,要么静态分配内存。

于 2013-08-15T13:32:10.240 回答