1. Уважаемые гости и пользователи форума.
    Администрация настоятельно рекомендует не регистрировать несколько аккаунтов для одного пользователя. При выявлении наличия мультиаккаунтов будут заблокированы все учетные записи данного пользователя.
    Аккаунты, зарегистрированные на временную почту будут также заблокированы.

Как правильно задекларировать "хитрые" WinAPI?

Тема в разделе "Inno Setup", создана пользователем Isica, 10 фев 2018.

  1. Пользователь

    Регистрация:
    17 янв 2017
    Сообщения:
    3
    Симпатии:
    0
    Вот три случая:
    1. Входной параметр функции может быть как строкой, так и числом.
    Пример: GetProcAddress (может принимать как имена функций, так и их ординалы).

    2. Функция сама создает строку и возвращает указатель на нее через выходной параметр.
    Пример: VerQueryValue.

    3. Функция принимает указатель на буфер и заполняет его (в т.ч. и символами 0x00).
    Пример: ReadFile.

    Подскажите, как на inno-паскале правильно задекларировать и вызывать эти функции?
     
  2. Ветеран Модератор

    Регистрация:
    26 июн 2011
    Сообщения:
    1.071
    Симпатии:
    711
    Код (Inno):

    #ifdef UNICODE
      #define A "W"
    #else
      #define A "A"
    #endif

    function GetProcAddress(hModule: THandle; lpProcName: AnsiString): Longint; external 'GetProcAddress@kernel32.dll stdcall';
    function VerQueryValue(var pBlock: Byte; lpSubBlock: String; var lplpBuffer: DWord; var puLen: Integer): Boolean; external 'VerQueryValue{#A}@version.dll stdcall delayload';
    function ReadFile(hFile: THandle; lpBuffer: AnsiString; nNumberOfBytesToRead: DWORD; var lpNumberOfBytesRead: DWORD; lpOverlapped: Longint): BOOL; external 'ReadFile@kernel32.dll stdcall';
     
    Пример с GetProcAddress
    Пример с VerQueryValue
    Пример с ReadFile
     
  3. Пользователь

    Регистрация:
    17 янв 2017
    Сообщения:
    3
    Симпатии:
    0
    sergey3695, спасибо.
    Только по п.1 непонятно, как с такой декларацией вызвать GetProcAddress по ординалу? Разве Паскаль позволяет передать число, когода параметр задекларирован как AnsiString??
     
  4. Ветеран

    Регистрация:
    27 мар 2014
    Сообщения:
    334
    Симпатии:
    66
    Пол:
    Мужской
    Функция StrToInt
     
    sergey3695 нравится это.
  5. Ветеран Модератор

    Регистрация:
    26 июн 2011
    Сообщения:
    1.071
    Симпатии:
    711
    Код (Inno):

    #ifdef UNICODE
      #define A "W"
    #else
      #define A "A"
    #endif

    function SetWindowText(hWnd: Longint; lpString: String): Longint; external 'SetWindowText{#A}@user32.dll stdcall';
    function GetProcAddress(hModule: THandle; lpProcName: Longint): Longint; external 'GetProcAddress@kernel32.dll stdcall';
    // GetProcAddress(GetModuleHandle('kernel32.dll'), SetWindowText(0,'ExitProcess')); или StrToInt :)
     
     
    Последнее редактирование: 11 фев 2018
  6. Пользователь

    Регистрация:
    17 янв 2017
    Сообщения:
    3
    Симпатии:
    0
    Нет, не оно! ;)

    Что тут делает SetWindowText--ведомо одному лишь Зелёному Змею, только вместо, вероятно, ожидаемого указателя на строку (или ординала :D) ExitProcess, она тупо возвращает 0, как и велит ей MSDN.

    Ещё раз повторю первый вопрос. Входной параметр функции может быть как строкой, так и числом DWORD (походу, вот ещё функция--FindResource, у которой аж два таких параметра). Так возможно ли её задекларировать таким образом, чтобы её, без особого геморроя, можно было вызвать с параметрами обоих этих типов? Или проще сделать две декларации?
     
  7. Ветеран Модератор

    Регистрация:
    26 июн 2011
    Сообщения:
    1.071
    Симпатии:
    711
    да, я не знаю как в inno в данном случае указать.
     
    Последнее редактирование: 11 фев 2018

Поделиться этой страницей