Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Передача строк в COM-DLL / 9 сообщений из 9, страница 1 из 1
03.01.2021, 17:32
    #40033208
sdsfy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача строк в COM-DLL
Всех с наступившим!

Проблема возможно классическая и, вероятно, имеет простое решение, которое, надеюсь, подскажите.

Имеем COM-Obj засунутый в DLL и приложение. Все написано на Delphi. Причем Сервер на D10.3, на D2007.

Вот реализуемый интерфейс

Код: pascal
1.
2.
3.
4.
5.
6.
IMethodManage_1 = interface
    ['{1851DAC2-0450-4CD4-B988-816EC0820A99}']
    function SetParams(main_id, Emp_Id, Tex_Id: Integer) : Integer; stdcall;
    function SetDBParams(DBName, DBUserName, DBUserPassWord: PChar) : Integer; stdcall; //
    function RunTest(var Res: Integer): Integer; stdcall; //
end; //


Так вот, строки по следующей функции не доходят.

Код: pascal
1.
2.
    IMethodManage_1 = interface
    function SetDBParams(DBName, DBUserName, DBUserPassWord: PChar) : Integer; stdcall; //



Но, стоит этот COM вызвать из клиента написанного на D10.3 и все OK.
Я понимаю, что проблема кроется в переходе Delphi на Unicode с версии D2009, но не понимаю какие конвертации применить, чтоб эту задачку решить.
...
Рейтинг: 0 / 0
03.01.2021, 17:58
    #40033209
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача строк в COM-DLL
sdsfy
Так вот, строки по следующей функции не доходят.

Не хотите ли показать, как их посылаете?

P.S. Вангую, что надо заменить string на AnsiString.
...
Рейтинг: 0 / 0
03.01.2021, 18:09
    #40033210
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача строк в COM-DLL
sdsfyне понимаю какие конвертации применить, чтоб эту задачку решить.

Заменить в интерфейсе PChar на OleStr. Пересобрать сервер и клиент.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
03.01.2021, 19:04
    #40033219
sdsfy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача строк в COM-DLL
softwarer,

вот это самое из клиента на d10.3, до COM доходит все, и так и этак засунутое в качестве параметра.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
var
  dbname: pchar;
  ansistr: pansistring;
begin
  ansistr := Pansistring(DBNameEdit.Text);
  dbname := pchar(ansistr);
  ITest1.SetDBParams(dbname, pChar(DBUserNameEdit.Text), pChar(DBUserPassEdit.Text));
...
Рейтинг: 0 / 0
03.01.2021, 19:22
    #40033223
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача строк в COM-DLL
sdsfy
вот это самое из клиента на d10.3, до COM доходит все, и так и этак засунутое в качестве параметра

Не удивительно. Потому что там Edit.Text имеет тип AnsiString, и все эти в пользу бедных приведения указателей ничего не меняют.

P.S. Не пробовал, но на глаз Дмитрий выше дал хороший совет.
...
Рейтинг: 0 / 0
03.01.2021, 19:29
    #40033230
sdsfy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача строк в COM-DLL
softwarer
sdsfy
вот это самое из клиента на d10.3, до COM доходит все, и так и этак засунутое в качестве параметра

Не удивительно. Потому что там Edit.Text имеет тип AnsiString, и все эти в пользу бедных приведения указателей ничего не меняют.

P.S. Не пробовал, но на глаз Дмитрий выше дал хороший совет.


Возможно, стоит попробовать.
Но как понимаю, PChar передает указатель на строку, которая должна как-то просто перекодироваться видимо в UNICODE на стороне COM. Но вот как?
Попытки присвоить переменным типа string с приведением типов не работают.
...
Рейтинг: 0 / 0
03.01.2021, 19:38
    #40033237
Kazantsev Alexey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача строк в COM-DLL
sdsfy,

Проблема у тебя в том, что до D2009 PChar = PAnsiChar, а начиная с D2009 PChar = PWideChar. Поэтому решения может быть два:
1. Заменить PChar на конкретный тип: PAnsiChar или PWideChar.
2. Заменить PChar на тип WideString (OleStr это псевдоним данного типа). Это системный строковый тип.

Второй вариант лучше.
...
Рейтинг: 0 / 0
03.01.2021, 19:39
    #40033238
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача строк в COM-DLL
sdsfy
Но как понимаю, PChar передает указатель на строку

PChar передаёт указатель, про который Вы поклялись мамой, что это указатель на 0-терминированную последовательность char-ов. При этом у Вас сервер и клиент понимают под char-ом разные вещи, а Вы плохо ориентируетесь в происходящем, шаманите наугад и Ваша клятва оказывается ложной.

Ещё раз - Дима дал хороший совет. Обойдитесь без ненужных сложностей, используйте стабильный тип данных, одинаковый для любого клиента.
...
Рейтинг: 0 / 0
03.01.2021, 20:33
    #40033259
sdsfy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача строк в COM-DLL
Да, действительно, все оказалось просто.
Спасибо коллеги. Еще раз с новым годом!
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Передача строк в COM-DLL / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]