Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.06.06;
Скачать: CL | DM;

Вниз

Куда пропадают сиволы?   Найти похожие ветки 

 
k@rt ©   (2004-05-23 21:38) [0]

Делаю так

type
 TPluginMain = function ({...}var AllText{...}: PChar): Integer; stdcall;
const
 csPluginMain  = "PluginMain";
 {...}

// Код в программе ------------------------------------------//

function mPluginRun({...}var S: String): TPluginModifiedData;
var
 hPlugin: Integer;
{...}
 plRes: Integer;
 AllText: PChar;
{...}
begin
{...}
 hPlugin := LoadLibrary(PChar(PluginPath));
{...}
 @Main := GetProcAddress(hPlugin, csPluginMain);
{...}
 AllText := PChar(S);
 // Length(AllText) = 500 000
 plRes := Main(AllText);
 // Length(AllText) = 15 000 - почему?
 S := StrPas(AllText);
{...}
 FreeLibrary(hPlugin);
end;

// Код в Dll ------------------------------------------//
function PluginMain({...}var AllText: PChar): Integer; stdcall;
var
 S: String;
begin
 S := AnsiString(AllText:
 // Length(S) = 500 000
 // Издеваюсь над текстом
 AllText := PChar(S);
 // Length(AllText) = 500 000
 Result := plModAllText;
end;


Куда пропадают ~485 000 символов. И как этого избежать?


 
k@rt ©   (2004-05-23 21:39) [1]

{...} - это я ненужное отрезал...


 
bars ©   (2004-05-23 21:46) [2]

Попробуй ShareMem в uses поставить как к dll так и к приложению (на первое место)


 
k@rt ©   (2004-05-23 23:37) [3]

//Bars
Не помогает.


 
Cobalt ©   (2004-05-24 00:57) [4]

А что, если попробовать использовать эту же функцию в проге, а не в плагине? Будет такая же утечка?
Если нет - знчит что-то с выделением памяти.
Если да - значит, нужно более тщательно смотреть код.

Кстати, а содержимое текста, того, что ты возвращаешь из плагина, и того, что ты получаешь в основной проге, хотя бы в первых 15000 совпадают?
Если совпадают, то не попадают ли в текст символы #0?


 
jack128 ©   (2004-05-24 03:27) [5]

Уж сколько раз твердили миру, НУ НЕЛЬЗЯ ВОЗВРАЩАТЬ ИЗ ФУНКЦИИ PChar(s), ГДЕ s - ЛОКАЛЬНАЯ ПЕРЕМЕННАЯ. s - уничтожится при выходе из функции и получим битый указатель..Посмотри как в Api реализован возврат PChar из dll, например GetWindowText и тому подобное...


 
k@rt ©   (2004-05-24 20:07) [6]

Все понял! Нужно использовать StrCopy(NewS, PChar(S));



Страницы: 1 вся ветка

Текущий архив: 2004.06.06;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.034 c
4-1083050775
luka
2004-04-27 11:26
2004.06.06
Сообщения


14-1084958483
ИМХО
2004-05-19 13:21
2004.06.06
Посоветуйте проверенный компонент


1-1085335968
DIS
2004-05-23 22:12
2004.06.06
EoleSysError


4-1082716605
Alecs
2004-04-23 14:36
2004.06.06
Список системных ошибок


1-1085389679
ПрогерШу
2004-05-24 13:07
2004.06.06
Как у класса создать свойство - массив?