Страница 1 из 2

Помогите создать прототип...

Добавлено: 18 Апрель 2018, 10:39
Constantine
Уважаемые коллеги! Помогите, пожалуйста...
Нужно вызвать функцию API. В MSDN описана так:
DWORD WINAPI MsgWaitForMultipleObjectsEx(
_In_ DWORD nCount,
_In_ const HANDLE *pHandles,
_In_ DWORD dwMilliseconds,
_In_ DWORD dwWakeMask,
_In_ DWORD dwFlags
);
Пробовал варианты:
MsgWaitForMultipleObjectsEx(DWORD,HANDLE[],DWORD,DWORD,DWORD),DWORD,PASCAL,RAW,NAME('MsgWaitForMultipleObjectsEx');
MsgWaitForMultipleObjectsEx(DWORD,*HANDLE[],DWORD,DWORD,DWORD),DWORD,PASCAL,RAW,NAME('MsgWaitForMultipleObjectsEx');
MsgWaitForMultipleObjectsEx(DWORD,HANDLE,DWORD,DWORD,DWORD),DWORD,PASCAL,RAW,NAME('MsgWaitForMultipleObjectsEx');
MsgWaitForMultipleObjectsEx(DWORD,*HANDLE,DWORD,DWORD,DWORD),DWORD,PASCAL,RAW,NAME('MsgWaitForMultipleObjectsEx')...
На все говорит "Unresolved external".

Помогите создать прототип...

Добавлено: 18 Апрель 2018, 11:02
kreator
A HANDLE у Вас как описан? Определённо в нём проблемы. Ну не с DWORD?

Помогите создать прототип...

Добавлено: 18 Апрель 2018, 11:07
Constantine
Пробовал HANDLE, DWORD, LONG, ULONG.
В SVAPI описана аналогичная функция -
MsgWaitForMultipleObjects(long nCount, long pHandles, bool bWaitAll, long dwMilliseconds, |
long dwWakeMask),long,pascal
нет проблем... Но мне, к сожалению, нужна только эта... :-(

Помогите создать прототип...

Добавлено: 18 Апрель 2018, 11:18
kreator
Возьми свой третий вариант и убери RAW из возвращаемого параметра.

Помогите создать прототип...

Добавлено: 18 Апрель 2018, 11:21
Constantine
Уже убрал RAW и NAME. Не помогает.

Помогите создать прототип...

Добавлено: 18 Апрель 2018, 11:31
kreator
Попробовал у себя. Вот так не ругается:

Код: Выделить всё

  HWND                    EQUATE(UNSIGNED)
  DWORD                  EQUATE(ULONG)
  MsgWaitForMultipleObjectsEx(DWORD,HWND,DWORD,DWORD,DWORD),LONG,PASCAL,NAME('MsgWaitForMultipleObjectsEx')
Во всяком случае на этапе компиляции.

Помогите создать прототип...

Добавлено: 18 Апрель 2018, 11:42
Constantine
Да, спасибо, так компиляцию проходит. Вываливается на этапе линковки с Unresolved external.
Вызов:
RET#=MsgWaitForMultipleObjectsEx(1,ADDRESS(HANDLES),INFINITE,QS_ALLEVENTS,0)

Помогите создать прототип...

Добавлено: 18 Апрель 2018, 11:55
kreator
Попробуйте вместо конструкции ADDRESS(HANDLES) поставить переменную такого же типа как в описании прототипа. Надеюсь, все остальные переменные в норме. Кстати, можно посмотреть в svcom.clw как работать с подобной функцией.

Помогите создать прототип...

Добавлено: 18 Апрель 2018, 12:09
Constantine
Спасибо, буду разбираться дальше...

Помогите создать прототип...

Добавлено: 18 Апрель 2018, 12:25
Дед Пахом
Версия Clarion не указана, хотя это важно - MsgWaitForMultipleObjectsEx появилась в WIN32.LIB только в 10-ке. Поэтому в младших версиях надо или создать свою LIB (через libmaker), или вызывать динамически (LoadLibrary/FreeLibrary/GetProcAddress).

Помогите создать прототип...

Добавлено: 18 Апрель 2018, 13:07
Constantine
Спасибо, Дед Пахом. Решилось перетаскиванием WIN32.LIB из 10-ки в 6-ку...

Помогите создать прототип...

Добавлено: 18 Апрель 2018, 13:10
vic7tar
kreator писал(а): 18 Апрель 2018, 11:31 HWND EQUATE(UNSIGNED)
HWND EQUATE(LONG)

Помогите создать прототип...

Добавлено: 18 Апрель 2018, 13:11
Дед Пахом

Код: Выделить всё

HWND  EQUATE(HANDLE)

Помогите создать прототип...

Добавлено: 18 Апрель 2018, 13:39
vic7tar
Дед Пахом писал(а): 18 Апрель 2018, 13:11

Код: Выделить всё

HWND  EQUATE(HANDLE)
Я лишь подчеркнул, что указатель должен быть знаковым.

Помогите создать прототип...

Добавлено: 18 Апрель 2018, 13:51
Constantine
Это не имеет значения. В итоге работает и с LONG'ами в прототипе. Проблема была в том, что этой функции нет в Win32.lib 6-ки, а цеплять системную user32.lib дело очень неблагодарное. Решилось перетаскиванием Win32.lib из 10-ки в 6-ку. Кроме того, в MSDN прототип был описан неверно, верное описание пришлось искать по форумам.