![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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