Top.Mail.Ru
Ответы

Вопрос по Win API

TMBox = function (hWnd: HWND; lpText, lpCaption: PChar; uType: UINT): Integer; stdcall;

var
user32 : HMODULE;
Box: TMBox;
Name,str:TUnicodeString;
p:pointer;
....
RtlInitUnicodeString(@Name, 'user32.dll');
LdrLoadDll(nil, 0, @Name, @User32);
{хэндл не нулевой . я проверяла}
RtlFreeUnicodeString(@Name);
RtlInitUnicodeString(@str, 'MessageBoxA');
LdrGetProcedureAddress(user32,0,@str,p);
RtlFreeUnicodeString(@str);
@box:=p;
box(0,'qe','qwe',0);

вот тут сразу вылазит ошибка....будто процедура ссылается на пустое пространство...хотя полученный указатель P не пустой иGetLasError после LdrGetProcedureAddress показывакт 0...
пожскажите где ошибка?

По дате
По рейтингу
Аватар пользователя
Мудрец
15лет

Не в том ли ошибка что выз-ся юникод функции (RtlFreeUnicodeString, RtlInitUnicodeString, RtlFreeUnicodeString) для использования MessageBoxA ?

Аватар пользователя
Мудрец
15лет

Аватар пользователя
Гуру
15лет

Я бы объявил так:
TMBox = function (hWnd: HWND; lpText, lpCaption: PChar; uType: UINT): Integer; stdcall;
PMBox = ^TMBox

var
Box : PMBox

А последние 2 строчки переписал бы так:

Box = PMBox(p);
box(0,'qe','qwe',0);