воть, но структуры и функции на С++ сам переписывай.., мне пока не до этого...
Как я уже говорил в Дельфи не силён...посему не пинайте сильно если что не так.
Код:
function TPlugin.LoadInfo: Boolean;
begin
...
Info:=String(GetPluginInfo(version));
>>> GetPluginInfo возвращает указатель на строку
и присваивает его нашей глобальной переменной Info.
...
FreeLibrary(hLib);
>>> уничтожаем библиотеку и заодно наш указатель на строку (на самом деле он продолжает висеть в памяти, так как DLL сделанная в Дельфи не освобождает переменные String пока счётчик использований не достигнет 0)
Result:=True;
end;
предлагаю внести небольшое изменение в функции TPlugin.LoadInfo и TPlugin.LoadPlugin
Код:
function TPlugin.LoadInfo: Boolean;
var
tempString:PChar;
begin
...
tempString:=(GetPluginInfo(version));
Info:=tempString;
...
end;
Код:
function TPlugin.LoadPlugin: Boolean;
var
tempString:PChar;
begin
...
tempString:=(GetPluginInfo(version));
Info:=tempString;
...
end;
RoZ, ты не прав, Info:=String(GetPluginInfo(version)) - копирует строку находящуюся по указателю возвращаемому GetPluginInfo в переменную Info так как типы PChar и String в одном месте памяти плохо ужываются ибо разные они....
__________________
Я здесь практически не появляюсь!, Skype - ikskor
RoZ, ты не прав, Info:=String(GetPluginInfo(version)) - копирует строку находящуюся по указателю возвращаемому GetPluginInfo в переменную Info так как типы PChar и String в одном месте памяти плохо ужываются ибо разные они....
Да, ты приводишь PChar к String, уже потом их приравниваешь, но строки в Дельфи очень хитрые люди делали, и они решили сэкономить на памяти и поэтому при присваивании String:=String копируется адрес, так сказать оптимизация во всей красе... http://www.sources.ru/magazine/0804/delphistr.html - вот тут очень подробно расписаны особенности строк в Дельфи.
З.Ы. Почему собственно я это заметил, дело в том что если DLL написана на С++, то при уничтожении библиотеки, по адресу перменной Info пустота...
З.Ы.Ы. Прошу сильно не пинать и показать где я ошибся.
RoZ, дело в том что если преобразовывать String в PChar то получается просто указатель на первый символ строки, а вот если наоборот PChar в String, то надо перед первым символом ещё разместить счётчик ссылок и длинну строки, поэтому строка при этом копируется и получается что если есть переменная p типа PChar, то PChar(String(p))<>p
__________________
Я здесь практически не появляюсь!, Skype - ikskor
RoZ, дело в том что если преобразовывать String в PChar то получается просто указатель на первый символ строки, а вот если наоборот PChar в String, то надо перед первым символом ещё разместить счётчик ссылок и длинну строки, поэтому строка при этом копируется и получается что если есть переменная p типа PChar, то PChar(String(p))<>p
А может быть что "новый" String из PChar он создаёт в адресном протранстве DLL так как память первоначально была выделена под PChar там же? Впрочем всё это мои домыслы, пока буду разбираться в Дельфи дальше, авось чего еще и раскопаю..
З.Ы. Кому интересно можно прочитать про похожую ситуацию вот тут http://forum.sources.ru/index.php?showtopic=98659# хотя она и не подходит на 100%. Завтра попробую переписать функцию по другому, как там советуют, хотя из меня Дельфист тот ещё...