Клиент kbmmw: проблема с 64-битным потоком запросов - PullRequest
0 голосов
/ 14 апреля 2020

Я разработал клиент-серверное приложение с использованием 64-битного пакета kbmmw в Delphi 10.3 IDE. 64-разрядное клиентское приложение отправляет запросы на сервер с помощью метода SendRequest (метод класса kbmmwClient), задающего имя службы запросов и свойства имени пользователя. Внутри библиотека kbmmwClient создает поток запросов (класс TkbmMWCustomRequestTransportStream), который будет отправляться на сервер.

tRequestStream:=TkbmMWCustomRequestTransportStream(cStreamClass.Create(FTransport,FTransport.Info));
tRequestStream.RequestID:=rid;
tRequestStream.ServiceName:=AServiceName;
tRequestStream.Username:=FUsername;
--Begin my debug-----------------
debug('InternalSendRequest - tRequestStream.ServiceName: ' + tRequestStream.ServiceName);
debug('InternalSendRequest - tRequestStream. Username: ' + tRequestStream.Username);
t := tkbmmwmemorystream(tRequestStream.DataStream);
SetString(streamstring, PAnsiChar(t.Memory), t.Size);
write_debug('InternalSendRequest - tRequestStream - DataStream: ' + streamstring);
--End my debug

Это результат отладки:

14/04/2020 15:50:32.226: InternalSendRequest - tRequestStream.ServiceName: reqservice
14/04/2020 15:50:32.226: InternalSendRequest - tRequestStream. Username: ANDAPI
14/04/2020 15:50:32.227: InternalSendRequest - tRequestStream - DataStream: Ìû¯
   STANDARDü     
   r e q s e r v i c e            A N D A P I             ÿÿÿÿ        €                    

Почему используются символы слова службы (reqservice) и слова имени пользователя (ANDAPI) с нулевыми символами? Когда я использовал 32-битный kbmmwClient, поток запросов был отправлен в правильном формате.

1 Ответ

0 голосов
/ 15 апреля 2020

ServiceName, UserName и многие другие строки передаются в виде строк kbmMW. Как именно они передаются в потоковом режиме, зависит от:

  1. Поддерживает ли компилятор Unicode?
  2. Версия транспортного потока> = 300?
  3. Установлена ​​ли в транспорте mwtsoUnicodeStrings? параметры потока?

Если Unicode не поддерживается, отправляются 8-битные строки без кодированной страницы (без нулей). Если точки 2 и 3 не совпадают, они также отправляются как 8-битные не кодированные строки (простое преобразование из Unicode)

Так что я предполагаю, что если вы используете ту же версию Delphi, что вы, в вашем 32-битном коде специально понижена версия транспортного потока для совместимости со старой версией kbmMW?

с наилучшими пожеланиями Kim / C4D

...