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

Isica

Мимокрокодил
Вот три случая:
1. Входной параметр функции может быть как строкой, так и числом.
Пример: GetProcAddress (может принимать как имена функций, так и их ординалы).

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

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

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

sergey3695

Ветеран
Модератор
Код:
#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
 

Isica

Мимокрокодил
sergey3695, спасибо.
Только по п.1 непонятно, как с такой декларацией вызвать GetProcAddress по ординалу? Разве Паскаль позволяет передать число, когода параметр задекларирован как AnsiString??
 

sergey3695

Ветеран
Модератор
Код:
#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 :)
 
Последнее редактирование:

Isica

Мимокрокодил
Нет, не оно! ;)

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

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