Текущий архив: 2004.06.13;
Скачать: CL | DM;
ВнизDLL обмен строками Найти похожие ветки
← →
GEN++ © (2004-05-28 01:47) [0]procedure TForm1.Button1Click(Sender: TObject);
var
Bin:PChar;
BOut:PChar;
begin
BIn:=strAlloc(30);
BOut:=strAlloc(30);
strPCopy(Bin,edit1.Text);
my_P(Bin,BOut);
edit2.Text:=strPas(Bout);
StrDispose(Bin);
StrDispose(BOut);
end;
в DLL
.....
var
X:PChar;
{$R *.RES}
procedure my_P(bIn,bOut:PChar); stdcall;
begin
X:=strAlloc(60);
strCopy(X,bIn);
strCopy(bOut,X);
end;
Никак не могу добиться обмена
Уже просто клинч
Если можно помогите с примером или ссылкой. Спасибо.
← →
Mim1 © (2004-05-28 07:00) [1]В глаза бросается strPCopy(Bin,edit1.Text); вместо strlcopy, но причина ошибки(если она есть) скорее всего не в этом (тем более что у эдита может быть тграничение на размер вводимого текста). Может проблемма в импортровании / экспортировании процедуры из библиотеки, что говорит отладчик по этому поводу?
← →
GEN++ © (2004-05-28 08:42) [2]strPCopy - копирует pascal в pchar
В отладчике:передд вызовом my_P в bIn правильный текст, в bOut -
мусор, после вызова тоже самое.
← →
GEN (2004-05-28 10:58) [3]Кроме того после срабатывания вызывающей программы на эране окно
"Программа выполнила недопустимую операцию и будет закрыта"
и это на 2-ч разных компах.
Может быть D5 глючная
← →
panov © (2004-05-28 11:02) [4]В основном приложении парвильно описана процедура?
procedure my_P(bIn,bOut:PChar); stdcall; external "StrDLL.dll";
← →
Mim1 © (2004-05-28 11:47) [5][3] GEN (28.05.04 10:58)
Нет Delphi скорее всего не причем.
> Может проблемма в импортровании / экспортировании процедуры
> из библиотеки,
Что по поводу [4] ?
← →
GEN (2004-05-28 12:31) [6]Если поместить процедуру из dll в вызывающую прграмму, то все
нормально работает => все проблемы в Dll
в основной программе описание
procedure my_P(bIn,bOut:PChar);stdcall;
external "LCopy_String.dll";
dll в файле LCopy_String.dll в одном каталоге с вызывающе программой
При запуске программы из под Win98 при обращении к my_P выскакивает окно с сообщением
"Acces violation at adress 00466778 in vjdule "LCopy_String.dll
Write of adress 00444490"
такое впечатление, что dll и вызывающая программа работабт с разной памятью.
← →
Петров Денис © (2004-05-28 12:41) [7]> GEN (28.05.04 12:31) [6]
> такое впечатление, что dll и вызывающая программа работабт с
> разной памятью.
Впечатление, приближенное к реальности. Точнее, память, выделенная в DLL, может быть освобождена только в DLL. И, хотя мне смысл этих строк непонятен:
X:=strAlloc(60);
strCopy(X,bIn);
strCopy(bOut,X);
но у тебя в DLL выделяется память, которую потом ты освобождаешь в вызывающем ее приложении. Это - неверно.
← →
evvcom © (2004-05-28 15:03) [8]strAlloc - функция, использующая менеджер памяти Delphi. Поэтому комментарий, который генерит Delphi при создании кода новой dll, никак нельзя! Главное в этом комментарии: "ShareMem must be the first unit in your library"s USES clause AND your project"s USES clause if your DLL exports any procedures or functions that pass strings as parameters or function results".
Т.е. или ставь ShareMem в USES и там, и там. Или используй API функции HeapAlloc/HeapFree
← →
GEN (2004-05-28 16:44) [9]>evvco
>Т.е. или ставь ShareMem в USES и там, и там. Или используй API >функции HeapAlloc/HeapFree
Но ведь я работаю только с Pchar или в этом случае тоже нужно ссылаться на ShareMem
Обмена я всетаки добился - спасибо всем, но вот какая "фишка":
при закрытии основной формы лезет окно с информацией об ошибке
указателя в вызывающей программе. Память я честно освобождаю
внутри Dll.
← →
Erik1 (2004-05-28 16:57) [10]Тебе же написали, что ты делаеш неправильно! Разумеется в твоем случае лучше обойтись без ShareMem. Но память надо выделять через Win API или использовать String и дополнительную библиотеку, тут в новостях проходила. И никакого дополнительного Dll непотребуется.
← →
evvcom © (2004-05-28 17:25) [11]Заметил пропуск. Читай [8]:
"комментарий игнорировать никак нельзя!"
> Но ведь я работаю только с Pchar
А для PChar по-твоему что, не надо память выделять?
← →
GEN++ © (2004-05-28 21:13) [12]>evvcom
Спасибо еще раз, я догадался о "пропуске" сразу, что и
позволило реанимиловало программу и, надеюсь, поставило последнюю
точку в данной проблеме.
Еще раз спасибо всем.
С уважением Евгений.
Страницы: 1 вся ветка
Текущий архив: 2004.06.13;
Скачать: CL | DM;
Память: 0.47 MB
Время: 0.028 c