Парни всем привет сто лет тут не был, хоть и делфи плиз не удалять: Ребят что за студия Embarcadero® Delphi 11 Version 28.0.48361.3236 Copyright © 2023 Embarcadero Technologies, Inc. All Rights Reserved. на W11 встроенный отладчик работает и есть ли он там вообще не могу понять вопрос Код (Delphi): var DeleteFile_,CopyFile_,WinExec_,MoveFile_,MessageBox_:pointer; function GetAPI(dll:string;api:string):pointer; var myhand:integer; my:pointer; begin myhand := LoadLibraryA(pansichar(dll)); my := GetProcAddress(myhand,pansichar(api)); Result := my; end; procedure CopyFile(const a,b:pansichar); begin asm push 0 push b push a Call CopyFile_ end; end; procedure MessageBox(const Text, Caption: pansichar; Flags: Longint = $00000000); begin asm push Flags push Caption push Text push 0 Call MessageBox_ end; end; begin CopyFile_ := GetApi('kernel32.dll','CopyFileA'); MessageBox_ := GetApi('user32.dll','MessageBoxA'); MessageBox('АВАВАВ','АВАВАВ', $00000000); end. Вылетает с экзептом почему ????
Спасибо большое за ссылку посмотрю, на текущий момент просто хочу понять почему не работает вызов Айпи Мессаджбокс отладчик какой использовать на W11 &
Ребзя по делу кто нибудь напишите, второй вопрос дебагер какой использовать в студии что-то непонятное
Под какую битность скомпилировано? В каком конкретно месте вылетает? x64dbg (для любой битности). Если 32 бита, то, скорее всего, OllyDbg v2 будет работать (на W10 работает на ура).
Cyber_Mozg а где именно у вас ошибка? попробовал ради фана и интереса - пашет без ошибок https://prnt.sc/MLph-Rg_PDTI
--- Сообщение объединено, 26 авг 2024 --- --- Сообщение объединено, 26 авг 2024 --- У вас В7, 10? --- Сообщение объединено, 26 авг 2024 --- парни нашел ошибку function GetAPI(dll:PWideChar;api:PWideChar):pointer; var myhand:integer; my:pointer; begin myhand := LoadLibrary(PWideChar(dll)); my := GetProcAddress(myhand,PWideChar(api)); Result := my; end;
хотя у меня своя реализация была Код (Delphi): function LoadLibrary; external kernelbase name 'LoadLibraryW'; function LoadLibraryA; external kernelbase name 'LoadLibraryA'; function LoadLibraryW; external kernelbase name 'LoadLibraryW''; я так понял проблема вся была в определении типов данных ANSI и Unicode хотя так и непонятно Чет туго не могу понять зачем вообще PWideChar, неужели просто если определить данные как стринг не пройдет? Код (Delphi): function GetAPI(dll:PWideChar;api:MarshaledAString):pointer; var myhand:integer; my:pointer; begin myhand := LoadLibraryW([B]PWideChar[/B](dll)); my := GetProcAddress(myhand, MarshaledAString(api)); Result := my; end; procedure MessageBox(const Text, Caption:MarshaledAString); begin asm push 0 push Caption push Text push 0 Call MessageBox_ end; end; Какие то типы данных новые, Ребзя правильно понимаю если использую LoadLibraryA то данные в Анси передаю если LoadLibraryW то юникод ??? В общем я так понимаю нужно смотреть юниты и типы данных к примеру функция месседж бокс Код (Delphi): function MessageBox(hWnd: HWND; lpText, lpCaption: LPCWSTR; uType: UINT): Integer; stdcall; и т.д. еще непонятно зачем в описании функции lpText, lpCaption: LPCWSTR а выще указывается тип Код (Delphi): LPWSTR = PWideChar; LPSTR = MarshaledAString; {$EXTERNALSYM LPSTR} PLPSTR = ^LPSTR; {$EXTERNALSYM PLPSTR} LPCSTR = MarshaledAString; а Код (Delphi): MarshaledString = PWideChar; MarshaledAString = _PAnsiChr; Зачем все так запутанно ????? может кто подсказать при загрузке файла (консольного ап.) в Оолу ошибка Объясните почему плз
тип того A = ANSI W = Wide char спросите идиотов с МС зачем столько гавна нагородили не чтоб сразу в UTF8 все делать как в Линукс мирах
в верхнем сообщении в исходнике объявлены указатели на функции WinAPI, но не инициализированы - то есть фактические адреса этих функций в момент запуска приложения не помещены в эти указатели. поэтому попытка вызвать функции вызывает запуск кода с адресом 0х0000000 обычно когда приложение запускается, менеджер задач винды по списку импортируемых функций внутри .exe знает, чем и из каких dll хочет воспользоваться приложение и заменяет эти указатели в списке их фактическими адресами - которые могут меняться от машины к машине из-за разного оборудования, размера драйверов в памяти и т.д. это при статической линковке (когда в коде компилятору и линкеру явно указано что функция импортируемая) если же линковка динамическая, то приложение черпает функции не по фиксированному списку, а явно загружая нужные dll одну за другой по мере необходимости, через LoadLibrary() + GetProcAddress() при этом dll могут принадлежать как системе, и лежать в виде файлов в каталогах винды, так и дистрибутиву самого приложения. это не запутано, а гибко и удобно ) потому что например в си/си++ рантайм библиотеках нужные импорты функций WinAPI уже заранее созданы условным Борландом и разработчик просто указывает их в своем исходнике, как любые другие стандартные функции си. если хочется не использовать стандартные библиотеки, хозяин барин - но тогда вся суета с загрузкой в память dll и поиском в них адресов нужных функций WinAPI ложится на программиста. юникод версии функций как правило ожидают строки с каждым символом величиной два байта, поэтому попытка передать обычную строку из байтов в ...W функцию приведет к ерунде и вместо символов, и возможно к падению приложения из-за того, что завершающий строку нулевой байт будет воспринят как чей-то второй в паре байт. А строка лишится конца. и наоборот, попытка передать в ...A функцию строку из двухбайтных символов часто приведет к ошибке из-за второго в строке байта, равного нулю. Если первый символ не из национальных алфавитов ) при этом анализ/парсинг текстовых файлов ручками существенно проще в однобайтовой версии, поэтому эволюционно раньше всё было проще и в рамках 8бит на символ, а потом набежали китайцы со своими алфавитами и понеслась...