我正在努力使我的财务打印机在没有用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))
现在所有的作品都是葡萄酒。
提前致谢!
答案 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导出一个解除分配器,或者内存是静态分配的。