Главная страница
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.035 c
3-1084432467
SergeyI
2004-05-13 11:14
2004.06.06
Преобразовать _recordset в TMemoryStream


4-1082970130
sapsi
2004-04-26 13:02
2004.06.06
Переключение между приложениями


14-1084987325
Andy BitOff
2004-05-19 21:22
2004.06.06
TSynSpellCheck, проблеммы установки.


1-1085138478
AndersoNRules
2004-05-21 15:21
2004.06.06
Ikonka faila


14-1084538079
TRX
2004-05-14 16:34
2004.06.06
rabota v turbo pascal