Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Вопрос по Win API

Ксюнька Мыслитель (9730), на голосовании 13 лет назад
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...
пожскажите где ошибка?

Голосование за лучший ответ
Mephi1984 Гуру (3280) 13 лет назад
Я бы объявил так:
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);
КсюнькаМыслитель (9730) 13 лет назад
тож самое (((
Госп Один Мудрец (16717) 13 лет назад
КсюнькаМыслитель (9730) 13 лет назад
да это не принципиально какая функция.. при динамическом вызове с функции с помошью апи уровня ядра появляется ошибка

function MessageBox(hWnd: HWND; lpText, lpCaption: PChar; uType: UINT): Integer; stdcall;external user32 name 'MessageBoxA'; ну если все таки важно)))
Костя Кузнецов Мудрец (17142) 13 лет назад
Не в том ли ошибка что выз-ся юникод функции (RtlFreeUnicodeString, RtlInitUnicodeString, RtlFreeUnicodeString) для использования MessageBoxA ?
КсюнькаМыслитель (9730) 13 лет назад
ну а как это можно решить? или только стандартным GetProcAdress??
Костя Кузнецов Мудрец (17142) Ну вообще то я код этот не особо понимаю, да и время позднее уже) Если вызовется MessageBoxW то можно будет сказать что направление поиска ошибки верное.
Похожие вопросы