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

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

DLL: 'Privileged instruction'!!! [D7, WinXP]


Луарвик ©   (2004-09-27 23:21:00) 

Че за фигня такая?
Вызываю процедуру так:
{Пытаемся загрузить библиотеку}
 LibHandle := LoadLibrary('Project1.dll');
 {Если все OK}
 if LibHandle >= 32 then begin
   {...то пытаемся получить адрес функции в библиотеке}
   @GetSimpleText := GetProcAddress(LibHandle,'GetSimpleText');
   {Если и здесь все OK}
   if @GetSimpleText <> nil then
     {...то вызываем эту функцию и показываем результат}
     {ShowMessage(StrPas(}GetSimpleText(True){))};
 end;
 {И не забываем освободить память и выгрузить DLL}
 FreeLibrary(LibHandle);

Это в библиотеке:

library Project1;
Uses SysUtils;  
{$R *.RES}  

function GetSimpleText(LangRus: Boolean): PChar; stdcall;
begin
 {В зависимости от LangRus возвращаем русскую (True) либо английскую (False) фразу}
 if LangRus then
   Result := PChar('Здравствуй, мир!')
 else
   Result := PChar('Hello, world!');
end;

{Директива exports указывает, какие функции будут экспортированы этой DLL}
exports GetSimpleText;

Begin  
End.  

Че такое?


Луарвик   (2004-09-28 15:11:00) [1]

Гы
Defunct мне говорил не о том, но все же наставил на рабочий пример и я нашел ошибку у себя. Главное, что помог чел! Пасибо!


Суслик   (2004-09-28 12:38:00) [2]


> 12] Defunct ©   (28.09.04 12:32)
> посмотрю я когда там будут динамические строки вместо этих
> 'Hello world', тада вспонится и матчасть, и манера.

Дай тебе попробую объяснить.
Не стоит говорить о том, о чем имеешь неуверенные знания. Ошибаются абсолютновсе - такое бывает. Но ты это делаешь регулярно и не признаешь ошибок. Потомоу и совет такой - матчасть.


Игорь Шевченко   (2004-09-28 12:34:00) [3]

Defunct ©   (28.09.04 12:32) [12]

Матчасть учить. Думать над выученным.


Defunct   (2004-09-28 12:32:00) [4]

посмотрю я когда там будут динамические строки вместо этих 'Hello world', тада вспонится и матчасть, и манера.


Суслик   (2004-09-28 11:55:00) [5]

2defunct
Ты, братец, советуешь в очередной раз фиг знает что.
Что за манера? :-\


Игорь Шевченко   (2004-09-28 10:19:00) [6]


>  К тому же PChar помоему требует явного освобождения памяти
> при таком использовании как у вас (насчет последнего могу
> и ошибаться), но все равно лучше не рисковать.


Матчасть учить.


GuAV   (2004-09-28 01:47:00) [7]


> при попытке освободить будет AV.

не уверен точнее что непременно будет но по крайней мере возможно.


GuAV   (2004-09-28 01:44:00) [8]


> К тому же PChar помоему требует явного освобождения памяти
> при таком использовании как у вас

не-а. строки будут константами вставленными в код. память явно не выделяется и явного освобождения не требует, при попытке освободить будет AV.

> PS: PChar тоже лучше не использовать

PChar как раз можно.


Defunct   (2004-09-28 00:45:00) [9]

PS: PChar тоже лучше не использовать, а то могут появиться другие ошибки см.[1, 2]. К тому же PChar помоему требует явного освобождения памяти при таком использовании как у вас (насчет последнего могу и ошибаться), но все равно лучше не рисковать.


Луарвик   (2004-09-28 00:27:00) [10]

Ага, понял!!! Вот как надо было:
var
 Form1: TForm1;
 GetSimpleText: function(LangRus: Boolean): PChar;stdcall;

Пасибо!


Луарвик   (2004-09-28 00:23:00) [11]

В чем именно? PChar нельзя юзать в DLL?


Defunct   (2004-09-28 00:16:00) [12]

смотрите
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1095698261&n=0
пост [11]

function(LangRus: Boolean): PChar;
Вот именно в этом и ошибка.


Луарвик   (2004-09-28 00:11:00) [13]

Ага, тут вот оно как:
ShowMessage(StrPas(GetSimpleText(True)));
А GetSimpleText я описал так:
function(LangRus: Boolean): PChar;
Уже выдает такую ошибку: "Privileged instruction at 0x009ebcbc"


Defunct   (2004-09-28 00:06:00) [14]

В ту же степь:

Учимся читать подсказки(Hints) и предупреждения(Warnings) компилятора.


Defunct   (2004-09-28 00:04:00) [15]

function GetSimpleText(LangRus: Boolean): ShortString;

Учимся читать комментарии при создании DLL


Наверх

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