Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

DLL [D7]


Страницы:   1 2 3

ElectriC ©   (2007-03-20 02:02:00) 

Имеется Dll и, собственно, программа, к которой Dll подключается.
//----------------------------------------------
Код Dll:
...
function Res(i : byte) : PChar; stdcall;
begin
 case i of
   1 : Result := PChar(12345678901234567890);
   2 : Result := PChar(123456789012345678);
 end;
end;
...
exports
 Res;
begin
end.
//-----------------------------------------------
Программа имеет компонент Edit : TEdit.

Код программы:
...
public
 Res : function(i : byte) : PChar; stdcall;
...
Загрузка Dll и вызов функции;
...
Если Edit.Text := Res(1), то Edit.Text будет иметь вид: 12345678901234567890.
Если же Edit.Text := Res(2), то Edit.Text будет имет вид: 1234567890123456
+ добавляет пробел.
//-----------------------------------------------
Вопрос: Объяcните, пожалуйста, почему пропадает цифра 7 и 8, когда Edit.Text := Res(2)?


Kedge   (2007-03-20 08:42:00) [21]

BDS 2006 - компилится.


Сергей М.   (2007-03-20 08:41:00) [22]


> Kedge ©   (20.03.07 08:35) [32]


В D7 компиляция строки

1 : Result := PChar(12345678901234567890);

обязательно приведет к ошибке 'Integer constsnt too large' !

Так что утверждение "У меня компиляться и тот и "другой" не соответствует действительности.


Kedge   (2007-03-20 08:35:00) [23]

> [31] Сергей М. ©   (20.03.07 08:24)
Объясните, в чем разница ?
P.S.
У меня компиляться и тот и "другой".


Сергей М.   (2007-03-20 08:24:00) [24]


> Kedge ©   (20.03.07 08:20) [30]


> Не могу найти отличий (ни десяти, ни одного) :)


Печальный факт)


Kedge   (2007-03-20 08:20:00) [25]

> [28] Loginov Dmitry ©   (20.03.07 07:41)
> > function Res(i : byte) : PChar; stdcall;
> > begin
> > case i of
> >   1 : Result := PChar(12345678901234567890);
> >   2 : Result := PChar(123456789012345678);
> > end;
> > end;
>
>
> Что за извращение? Этож даже не скомпилится!
>
> function Res(i : byte) : PChar; stdcall;
> begin
> case i of
>  1 : Result := PChar(123456);
>  2 : Result := PChar(1234567);
> end;
> end;


Не могу найти отличий (ни десяти, ни одного) :)


Novice   (2007-03-20 07:47:00) [26]

>>Видимо, в них.
Ваша правда, уважаемый Loginov Dmitry :-)

>>Подключай модуль ShareMem самым первым модулем программы. Это нужно
>>делать в файле проекта *.dpr
Благодарю за помощь, теперь все в норме!


Loginov Dmitry   (2007-03-20 07:41:00) [27]

> function Res(i : byte) : PChar; stdcall;
> begin
> case i of
>   1 : Result := PChar(12345678901234567890);
>   2 : Result := PChar(123456789012345678);
> end;
> end;


Что за извращение? Этож даже не скомпилится!


function Res(i : byte) : PChar; stdcall;
begin
case i of
  1 : Result := PChar(123456);
  2 : Result := PChar(1234567);
end;
end;


Вот так должно скомпилится. Однако непонятно, зачем функция возвращает PChar, а не Integer? И какой нужна такая функция вообще, и тем более в DLL?


Loginov Dmitry   (2007-03-20 07:37:00) [28]

> В чем дело? В моих кривых руках?


Видимо, в них.

Подключай модуль ShareMem самым первым модулем программы. Это нужно делать в файле проекта *.dpr


Novice   (2007-03-20 07:34:00) [29]

Прошу прощения, ошибка Invalid Pointer Operation.


Novice   (2007-03-20 07:30:00) [30]

Дабы не плодить идентичные темы, задам здесь свой вопрос по DLL:
Я использую в своей программе некую собственноручно написанную DLL. В этой DLL идет работа со строками, поэтому я и в самой DLL-ке, и в программе, использующей эту DLL, подключаю модуль ShareMem. DLL подключается статически - через заголовочный файл. Директивы наподобие stdcall, resident и т.д. не использую.
И вот такая ситуация:
В программе в секции USES подключаю юнит ShareMem. Заголовочный файл для DLL не включаю в секцию, т.е. DLL даже не грузится в память. В программе вызовов функций из DLL нет. Запускаю программу, нажимаю кнопку 'X' - закрыть окно, и вылетает ошибка AccessViolation. Стоит отключить Sharemem, ошибка исчезает. В чем дело? В моих кривых руках? В кривом менеджере памяти?


SlymRO   (2007-03-20 04:44:00) [31]

Германн ©   (20.03.07 4:40) [22]
stdcall;

Ну зачем... Ему ведь еще всеравно регистры/стек...
[21]ElectriC
Прочел [18]? Что еще не понял?


Германн   (2007-03-20 04:43:00) [32]


> ElectriC ©   (20.03.07 04:40) [21]
>
>
> > Res : function(i : byte) : PChar; stdcall; external 'YourDll'
>
> Проверим!
>

Эее. Ты проверяй, но и думай при этом!  :)


Германн   (2007-03-20 04:40:00) [33]


> Германн ©   (20.03.07 04:37) [20]

За очепятки не судить! Сами такие! :)


ElectriC   (2007-03-20 04:40:00) [34]


> Res : function(i : byte) : PChar; stdcall; external 'YourDll'

Проверим!


Германн   (2007-03-20 04:37:00) [35]


> ElectriC ©   (20.03.07 04:18) [17]
>
>
> > Наверно могу. Но ты тут напустил такую дымовую завесу!
>  :
> > )
>
> please, напиши!
>

impementation
Res : function(i : byte) : PChar; stdcall; external 'YourDll'


ElectriC   (2007-03-20 04:29:00) [36]


> SlymRO ©   (20.03.07 04:24) [18]
> http://www.delphimaster.ru/cgi-bin/forum.pl?id=1173033268&n=18

Ща почитаем!


SlymRO   (2007-03-20 04:24:00) [37]

http://www.delphimaster.ru/cgi-bin/forum.pl?id=1173033268&n=18


ElectriC   (2007-03-20 04:18:00) [38]


> Наверно могу. Но ты тут напустил такую дымовую завесу! :
> )

please, напиши!


ElectriC   (2007-03-20 04:17:00) [39]

Как, вообще, лучше сделать?


Германн   (2007-03-20 04:17:00) [40]


> ElectriC ©   (20.03.07 04:10) [12]
>
> Можешь написать, как правильно сделать?
>

Наверно могу. Но ты тут напустил такую дымовую завесу! :)


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо