Главная страница
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.056 c
14-1084967317
AlexG
2004-05-19 15:48
2004.06.06
Кому нужны лодочные моторы?


3-1084739742
ЯЯЯ
2004-05-17 00:35
2004.06.06
как удалить пустую строку из dbgrid a ?(ado)


3-1084438276
Serge1
2004-05-13 12:51
2004.06.06
Обработка транзакций


1-1085303046
G_U_N
2004-05-23 13:04
2004.06.06
Видеокарта


1-1085025220
PAN2009
2004-05-20 07:53
2004.06.06
верхний регистр