Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.06.13;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.033 c
14-1085404673
Thor
2004-05-24 17:17
2004.06.13
как установить компонент из D6 на D8?


3-1084972238
ka
2004-05-19 17:10
2004.06.13
Транзакции


8-1080060325
__yur__
2004-03-23 19:45
2004.06.13
Как узнать что рисунок имеет белый фон


14-1085545258
Романов Р.В.
2004-05-26 08:20
2004.06.13
Олимпиада по программированию


3-1084983087
ceval
2004-05-19 20:11
2004.06.13
после перемещения столбцов не работает поиск по двум полям





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский