Доброго времени суток!
Нужно вызвать функцию из DLL и передать в неё параметр типа pchar.
Если я вызываю типа вот так:
var
ss:string;
res:integer;
begin
ss:='Data1';
res:=DLLfunc(pchar(ss));
end;
то всё работает нормально. А вот такой вот код
var
ss:string;
res:integer;
begin
ss:='Data1';
ss:=ss+' ';
delete(ss,length(ss),1);
res:=DLLfunc(pchar(ss));
end;
не работает - внутри DLL нечто происходит, что вызываемая функция корректно не работает, хотя очевидно, что значение переменной ss в обоих случаях одинаково, различается лишь область, где она находится.
DLL сторонняя, внутрь влезть не могу, что ей не нравится, не знаю.
Ясно, что в первом случае ss указывает на статическую область памяти, во втором на динамическую, но вот почему это не нравится DLL?
Буду рад любым подсказкам.
Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице. Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.
18-02-2019 10:07
PChar в современных Delphi - это PWideChar, а с более старых - PAnsiChar. Укажите конкретный тип.
13-02-2019 14:47 | Комментарий к предыдущим ответам
Провёл эксперимент.
Наблюдаются различные ожидаемые артефакты, когда DLL ждёт PAnsiChar, а получает PWideChar (и наоборот).
Но указанные операции ничего не меняют в этом поведении.
Может автор вопроса сказать, что возвращает функция в res?
13-02-2019 14:30 | Комментарий к предыдущим ответам
to Den Sarych
Действительно, поторопился. Беру свои слова обратно и посыпаю голову пеплом.
Но мне самому интересно, что может произойти с указателем и что там случается в DLL.
Даже если после копирования в память по новому указателю всё заработает, то тайна остаётся неразгаданной.
12-02-2019 09:16 | Комментарий к предыдущим ответам
>>>внутри DLL нечто происходит, что вызываемая функция корректно не работает
Для чистоты эксперимента с dll, можно вот так скопировать string в pChar:
var
...
wChar :pChar; //pAnsiChar -а там случаем не wide?
begin
...
wChar := StrAlloc( Length(ss) + 1);
StrPCopy(wChar, ss);
res := DLLfunc (wChar);
end;
для inferno
>>>Конечно, после вызова delete(ss,length(ss),1) по указателю на ss может быть всякий мусор.
Если не сложно, поясните. Удалили последний символ. На его месте образовался байт $00. Длина строки ss уменьшилась на 1. Length(PChar(@ss[1])) так же уменьшился. Где мусор?
Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter. Функция может не работать в некоторых версиях броузеров.