Непонятная проблема

Тема в разделе "WASM.BEGINNERS", создана пользователем Cyber_Mozg, 24 авг 2024.

  1. Cyber_Mozg

    Cyber_Mozg Andrey

    Публикаций:
    0
    Регистрация:
    4 апр 2005
    Сообщения:
    214
    Адрес:
    Russia
    Парни всем привет сто лет тут не был, хоть и делфи плиз не удалять:
    1. Ребят что за студия
      Embarcadero® Delphi 11 Version 28.0.48361.3236
      Copyright © 2023 Embarcadero Technologies, Inc. All Rights Reserved.
      на W11 встроенный отладчик работает и есть ли он там вообще не могу понять
    2. вопрос
    Код (Delphi):
    1. var
    2. DeleteFile_,CopyFile_,WinExec_,MoveFile_,MessageBox_:pointer;
    3. function GetAPI(dll:string;api:string):pointer;
    4. var myhand:integer;
    5.     my:pointer;
    6.    begin
    7.    myhand := LoadLibraryA(pansichar(dll));
    8.    my := GetProcAddress(myhand,pansichar(api));
    9.    Result := my;
    10.  end;
    11. procedure CopyFile(const a,b:pansichar);
    12.  begin
    13.  asm
    14.  push 0
    15.  push b
    16.  push a
    17.  Call CopyFile_
    18.  end;
    19.  end;
    20. procedure  MessageBox(const Text, Caption: pansichar; Flags: Longint = $00000000);
    21.  begin
    22.  asm
    23.  push Flags
    24.  push Caption
    25.  push Text
    26.  push 0
    27.  Call MessageBox_
    28.  end;
    29.  end;
    30. begin
    31. CopyFile_ := GetApi('kernel32.dll','CopyFileA');
    32. MessageBox_ := GetApi('user32.dll','MessageBoxA');
    33.  MessageBox('АВАВАВ','АВАВАВ', $00000000);
    34. end.
    Вылетает с экзептом почему ????
     
    Последнее редактирование: 25 авг 2024
  2. Cyber_Mozg

    Cyber_Mozg Andrey

    Публикаций:
    0
    Регистрация:
    4 апр 2005
    Сообщения:
    214
    Адрес:
    Russia
    Спасибо большое за ссылку посмотрю, на текущий момент просто хочу понять почему не работает вызов Айпи Мессаджбокс
    отладчик какой использовать на W11 &
     
  3. alex_dz

    alex_dz Active Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    608
    лучше сразу на win12 переходите
     
  4. Cyber_Mozg

    Cyber_Mozg Andrey

    Публикаций:
    0
    Регистрация:
    4 апр 2005
    Сообщения:
    214
    Адрес:
    Russia
    Ребзя по делу кто нибудь напишите, второй вопрос дебагер какой использовать в студии что-то непонятное
     
  5. Cyber_Mozg

    Cyber_Mozg Andrey

    Публикаций:
    0
    Регистрация:
    4 апр 2005
    Сообщения:
    214
    Адрес:
    Russia
    Раньше был норм на ollydbg похож сейчас же вообще непонятно что там
     
  6. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    4.268
    Cyber_Mozg,
    пожалуйста окружайте код программы тэгами [соdе=язык программирования] . . . [/соdе]
     
    Cyber_Mozg нравится это.
  7. Cyber_Mozg

    Cyber_Mozg Andrey

    Публикаций:
    0
    Регистрация:
    4 апр 2005
    Сообщения:
    214
    Адрес:
    Russia
  8. k3rnl

    k3rnl Member

    Публикаций:
    0
    Регистрация:
    28 янв 2021
    Сообщения:
    77
    MessageBox принимает 4 аргумента, а не 3.
     
  9. alex_dz

    alex_dz Active Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    608
    там все норм -
    Код (Delphi):
    1. push Flags
    2. push Caption
    3. push Text
    4. push 0
    5. Call MessageBox_
     
  10. Application

    Application Moderator Команда форума

    Публикаций:
    1
    Регистрация:
    8 дек 2007
    Сообщения:
    974
  11. Prober

    Prober Member

    Публикаций:
    0
    Регистрация:
    4 дек 2008
    Сообщения:
    56
    Под какую битность скомпилировано? В каком конкретно месте вылетает?

    x64dbg (для любой битности).
    Если 32 бита, то, скорее всего, OllyDbg v2 будет работать (на W10 работает на ура).
     
  12. alex_dz

    alex_dz Active Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    608
  13. Cyber_Mozg

    Cyber_Mozg Andrey

    Публикаций:
    0
    Регистрация:
    4 апр 2005
    Сообщения:
    214
    Адрес:
    Russia
    upload_2024-8-26_19-15-58.png
    --- Сообщение объединено, 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;
     
  14. alex_dz

    alex_dz Active Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    608
    у меня старая древнющяя Delphi7 FUll :)
    32 bit
    AnsiChar (фиксов для WideChar не надо)
     
  15. Cyber_Mozg

    Cyber_Mozg Andrey

    Публикаций:
    0
    Регистрация:
    4 апр 2005
    Сообщения:
    214
    Адрес:
    Russia
    хотя у меня своя реализация была
    Код (Delphi):
    1. function LoadLibrary; external kernelbase name 'LoadLibraryW';
    2. function LoadLibraryA; external kernelbase name 'LoadLibraryA';
    3. function LoadLibraryW; external kernelbase name 'LoadLibraryW'';
    я так понял проблема вся была в определении типов данных ANSI и Unicode хотя так и непонятно
    Чет туго не могу понять зачем вообще PWideChar, неужели просто если определить данные как стринг не пройдет?
    Код (Delphi):
    1. function GetAPI(dll:PWideChar;api:MarshaledAString):pointer;
    2. var myhand:integer;
    3.     my:pointer;
    4.    begin
    5.    myhand := LoadLibraryW([B]PWideChar[/B](dll));
    6.    my := GetProcAddress(myhand, MarshaledAString(api));
    7.    Result := my;
    8.  end;
    9.  procedure  MessageBox(const Text, Caption:MarshaledAString);
    10.  begin
    11.  asm
    12.  push 0
    13.  push Caption
    14.  push Text
    15.  push 0
    16.  Call MessageBox_
    17.  end;
    18.  end;
    Какие то типы данных новые, Ребзя правильно понимаю если использую LoadLibraryA то данные в Анси передаю если LoadLibraryW то юникод ???
    В общем я так понимаю нужно смотреть юниты и типы данных к примеру функция месседж бокс
    Код (Delphi):
    1. function MessageBox(hWnd: HWND; lpText, lpCaption: LPCWSTR; uType: UINT): Integer; stdcall;
    и т.д.
    еще непонятно зачем в описании функции lpText, lpCaption: LPCWSTR а выще указывается тип
    Код (Delphi):
    1. LPWSTR = PWideChar;
    2.    LPSTR = MarshaledAString;
    3.   {$EXTERNALSYM LPSTR}
    4.   PLPSTR = ^LPSTR;
    5.   {$EXTERNALSYM PLPSTR}
    6.   LPCSTR = MarshaledAString;
    а
    Код (Delphi):
    1. MarshaledString = PWideChar;
    2.   MarshaledAString = _PAnsiChr;
    Зачем все так запутанно ????? может кто подсказать при загрузке файла (консольного ап.) в Оолу ошибка
    Объясните почему плз
     

    Вложения:

    Win32Api нравится это.
  16. alex_dz

    alex_dz Active Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    608
    тип того
    A = ANSI
    W = Wide char
    спросите идиотов с МС зачем столько гавна нагородили

    не чтоб сразу в UTF8 все делать как в Линукс мирах
     
    sl0n и Win32Api нравится это.
  17. miilalex

    miilalex Member

    Публикаций:
    0
    Регистрация:
    8 сен 2024
    Сообщения:
    46
    в верхнем сообщении в исходнике объявлены указатели на функции WinAPI, но не инициализированы - то есть фактические адреса этих функций в момент запуска приложения не помещены в эти указатели.
    поэтому попытка вызвать функции вызывает запуск кода с адресом 0х0000000

    обычно когда приложение запускается, менеджер задач винды по списку импортируемых функций внутри .exe знает, чем и из каких dll хочет воспользоваться приложение
    и заменяет эти указатели в списке их фактическими адресами - которые могут меняться от машины к машине из-за разного оборудования, размера драйверов в памяти и т.д.

    это при статической линковке (когда в коде компилятору и линкеру явно указано что функция импортируемая)

    если же линковка динамическая, то приложение черпает функции не по фиксированному списку, а явно загружая нужные dll одну за другой по мере необходимости, через LoadLibrary() + GetProcAddress()

    при этом dll могут принадлежать как системе, и лежать в виде файлов в каталогах винды, так и дистрибутиву самого приложения.

    это не запутано, а гибко и удобно )

    потому что например в си/си++ рантайм библиотеках нужные импорты функций WinAPI уже заранее созданы условным Борландом и разработчик просто указывает их в своем исходнике, как любые другие стандартные функции си.

    если хочется не использовать стандартные библиотеки, хозяин барин - но тогда вся суета с загрузкой в память dll и поиском в них адресов нужных функций WinAPI ложится на программиста.

    юникод версии функций как правило ожидают строки с каждым символом величиной два байта, поэтому попытка передать обычную строку из байтов в ...W функцию приведет к ерунде и вместо символов, и возможно к падению приложения из-за того, что завершающий строку нулевой байт будет воспринят как чей-то второй в паре байт. А строка лишится конца.

    и наоборот, попытка передать в ...A функцию строку из двухбайтных символов часто приведет к ошибке из-за второго в строке байта, равного нулю. Если первый символ не из национальных алфавитов )

    при этом анализ/парсинг текстовых файлов ручками существенно проще в однобайтовой версии, поэтому эволюционно раньше всё было проще и в рамках 8бит на символ, а потом набежали китайцы со своими алфавитами и понеслась...
     
    Последнее редактирование: 8 сен 2024
    Cyber_Mozg нравится это.