Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.027 c
6-1082466294
Alan2
2004-04-20 17:04
2004.06.06
Проверка сайта на обновление


1-1085514574
CoderX
2004-05-25 23:49
2004.06.06
Имя RichEdit


1-1085072138
Nikoss
2004-05-20 20:55
2004.06.06
Как узнать порядковый номер объекта в динам. массиве ...


14-1085050729
Том
2004-05-20 14:58
2004.06.06
Как решить задачу !


4-1083671527
Dmitry Shkil
2004-05-04 15:52
2004.06.06
Как узнать имя активного пользователя под XP




   Наверх