Delphi и C++ POS-связь с DLL

Я пытаюсь заставить мой бюджетный принтер работать без "драйвера", который написан на c++, и обмениваться данными с файлами. Я хочу избежать этого и сделать прямую связь с помощью dll файла для фискального принтера.

После отправки команды "F0" (состояние принтера) в c++ ответ приложения: 060052000001000000018400000003AE514520202024D20333330393833322020202031352E30382E323031332031343A3330

После отправки команды "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))

Теперь все работает вино.

Заранее спасибо!

1 ответ

Перевод Delphi функции C++ неверен. Вы не можете использовать управляемые строки Delphi через границу DLL. Дельфийский эквивалент символа 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 экспортирует дезактиватор, либо память статически распределена.

licensed under cc by-sa 3.0 with attribution.