Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

проблемы с функциями win 2000

426
21 августа 2002 года
Krivonos
112 / / 20.01.2000
У меня почему-то не компилятся многие ф-ии Windows 2000 (MS Visual C++ 6.0 SP 5.0), описаные в MSDN, например,
GetWindowInfo, EnumDisplayDevices, а также структурка WINDOWINFO. компилятор выдает сообщение
такая-то функция - undeclared identifier. Я смотрел - все они описаны в
файле <winuser.h>, заголовки ф-ий имеются в \system\user32.dll - но! - в файле user32.lib
ничего такого нет. В чем возможная проблема? Может нужно поставить новый winuser.lib? И если да,
то где его можно взять?
Заранее благодарен
577
21 августа 2002 года
Mozhay
81 / / 20.09.2000
Во-первых, находим WINDOWINFO в файле winuser.h. Успешно находится (у меня в строке 9916). Затем двигаемся вверх и смотрим, нет ли какого-нибудь #ifdef или #if, который не выполняется. Находим (у меня на строке 9268)
#if(WINVER >= 0x0500)
Из-за него весь интересующий кусок и вырезается препроцессором. Выход простой - перед #include <windows.h> поставить
#define WINVER 0x0500
И все заработает.
А если проще, то поищи в MSDN &quot;Using the SDK Headers&quot; (с кавычками, чтобы было поменьше вариантов). Там все написано.
380
21 августа 2002 года
Arestov
285 / / 20.09.2000
Цитата:

On 2002-08-20 2242, Krivonos wrote
У меня почему-то не компилятся многие ф-ии Windows 2000 (MS Visual C++ 6.0 SP 5.0), описаные в MSDN, например,
GetWindowInfo, EnumDisplayDevices, а также структурка WINDOWINFO. компилятор выдает сообщение
такая-то функция - undeclared identifier. Я смотрел - все они описаны в
файле <winuser.h>, заголовки ф-ий имеются в systemuser32.dll - но! - в файле user32.lib
ничего такого нет. В чем возможная проблема? Может нужно поставить новый winuser.lib? И если да,
то где его можно взять?
Заранее благодарен



перед include <windows.h>

#define WINVER 0x0501

426
23 августа 2002 года
Krivonos
112 / / 20.01.2000
Ничего не помогло!
Получаю вот такое сообщение
myfile.obj error LNK2001 unresolved external symbol [EMAIL]__imp__EnumDisplayDevicesA@16[/EMAIL]

имеется ввиду если использую ф-ию EnumDisplayDevices.
Мне кажется проблема с файлом user32.lib
380
23 августа 2002 года
Arestov
285 / / 20.09.2000
Цитата:

On 2002-08-23 0847, Krivonos wrote
Ничего не помогло!
Получаю вот такое сообщение
myfile.obj error LNK2001 unresolved external symbol [EMAIL]__imp__EnumDisplayDevicesA@16[/EMAIL]

имеется ввиду если использую ф-ию EnumDisplayDevices.
Мне кажется проблема с файлом user32.lib



странно почему ругается линкер, точно VS 6?

но проблемы с WINDOWSPOS должны пройти

Вообще если делаешь прогу подкакую-то конкретную систему (скажем WinXP + IE 6) то надо перед includ'ами описывать версии, например

#define _WIN32_WINNT 0x0501 // WinXP
#define WINVER 0x0501

#define _WIN32_IE 0x0560 // IE 6

Таблица версий есть в MSDN, вот она
Minimum System Required Macros to Define
Windows 95 and
Windows NT 4.0 WINVER=0x0400
Windows 98 and
Windows NT 4.0 _WIN32_WINDOWS=0x0410 and WINVER=0x0400
Windows NT 4.0 _WIN32_WINNT=0x0400 and WINVER=0x0400
Windows 98 _WIN32_WINDOWS=0x0410
Windows 2000 _WIN32_WINNT=0x0500 and WINVER=0x0500
Windows Me _WIN32_WINDOWS=0x0490
Windows XP and
Windows .NET Server _WIN32_WINNT=0x0501 and WINVER=0x0501
Internet Explorer 3.0, 3.01, 3.02 _WIN32_IE=0x0300
Internet Explorer 4.0 _WIN32_IE=0x0400
Internet Explorer 4.01 _WIN32_IE=0x0401
Internet Explorer 5.0, 5.0a, 5.0b _WIN32_IE=0x0500
Internet Explorer 5.01, 5.5 _WIN32_IE=0x0501
Internet Explorer 6.0 _WIN32_IE=0x0560 or
_WIN32_IE=0x0600

577
23 августа 2002 года
Mozhay
81 / / 20.09.2000
Цитата:

On 2002-08-23 0847, Krivonos wrote
Ничего не помогло!
Получаю вот такое сообщение
myfile.obj error LNK2001 unresolved external symbol [EMAIL]__imp__EnumDisplayDevicesA@16[/EMAIL]


Есть два выхода
1. Проапдейтить Platform SDK.
2. Грузить ф-цию EnumDisplayDevices динамически, т.е. через LoadLibrary, GetProcAddress, т.к. в User32.dll она есть (точнее, есть EnumDisplayDevicesA и EnumDisplayDevicesW).

426
24 августа 2002 года
Krivonos
112 / / 20.01.2000
///////////////////////
Есть два выхода:
1. Проапдейтить Platform SDK.
2. Грузить ф-цию EnumDisplayDevices динамически, т.е. через LoadLibrary, GetProcAddress, т.к. в User32.dll она есть (точнее, есть EnumDisplayDevicesA и EnumDisplayDevicesW).
///////////////////////
Спасибо за советы!
А вообще каким образом осуществить п.1 и п.2?
380
26 августа 2002 года
Arestov
285 / / 20.09.2000
Цитата:

Спасибо за советы!
А вообще каким образом осуществить п.1 и п.2?



п1. видимо не нужен, у тя на VC6 всё должнобыть тип-топ, а вообще это можно сделать на сайте Microsoft. http//msdn.microsoft.com/downloads/default.asp

п2. ТЕОРИЯ

1. надо загрузить библиотеку LoadLibrary
2. получить указатель на ф-цию GetProcAddress
3. использовать ф-цию
4. выгрузить библиотеку FreeLibrary

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

Еще фишка в C++ строгие типы, по этому необходимо указатель возвращаемый GetProcAddress'ом привести к нужному типу, как обявить необходимый тип см. в ПРАКТИКА.
В Си это можно не делать.

ПРАКТИКА

// новый тип указатель на ф-цию EnumDisplayDevices
typedef BOOL (*LPFNENUMDISPLAYDEVICES)(
LPCTSTR lpDevice, // device name
DWORD iDevNum, // display device
PDISPLAY_DEVICE lpDisplayDevice, // device information
DWORD dwFlags // reserved
);

// сам указатель
LPFNENUMDISPLAYDEVICES pfnEnumDisplayDevices=NULL;

// дескриптор библиотеки
HMODULE hlib = LoadLibrary(&quot;user32.dll&quot;);

if (hlib)
{

pfnEnumDisplayDevices = (LPFNENUMDISPLAYDEVICES)GetProcAddress(hlib, &quot;EnumDisplayDevicesA&quot;);

if (pfnEnumDisplayDevices)
{
// используем
if (!pfnEnumDisplayDevices (
lpDevice, iDevNum, lpDisplayDevice, dwFlags))
{
ReportError(...);
}

}else
ReportError(...);

FreeLibrary(hlib);

}else
{

ReportError(...);

}

Аноним
Цитата:

On 2002-08-26 1052, Arestov wrote
[quote]
Спасибо за советы!
А вообще каким образом осуществить п.1 и п.2?



п1. видимо не нужен, у тя на VC6 всё должнобыть тип-топ, а вообще это можно сделать на сайте Microsoft. http//msdn.microsoft.com/downloads/default.asp

п2. ТЕОРИЯ

1. надо загрузить библиотеку LoadLibrary
2. получить указатель на ф-цию GetProcAddress
3. использовать ф-цию
4. выгрузить библиотеку FreeLibrary

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

Еще фишка в C++ строгие типы, по этому необходимо указатель возвращаемый GetProcAddress'ом привести к нужному типу, как обявить необходимый тип см. в ПРАКТИКА.
В Си это можно не делать.

ПРАКТИКА

// новый тип указатель на ф-цию EnumDisplayDevices
typedef BOOL (*LPFNENUMDISPLAYDEVICES)(
LPCTSTR lpDevice, // device name
DWORD iDevNum, // display device
PDISPLAY_DEVICE lpDisplayDevice, // device information
DWORD dwFlags // reserved
);

// сам указатель
LPFNENUMDISPLAYDEVICES pfnEnumDisplayDevices=NULL;

// дескриптор библиотеки
HMODULE hlib = LoadLibrary(&quot;user32.dll&quot;);

if (hlib)
{

pfnEnumDisplayDevices = (LPFNENUMDISPLAYDEVICES)GetProcAddress(hlib, &quot;EnumDisplayDevicesA&quot;);

if (pfnEnumDisplayDevices)
{
// используем
if (!pfnEnumDisplayDevices (
lpDevice, iDevNum, lpDisplayDevice, dwFlags))
{
ReportError(...);
}

}else
ReportError(...);

FreeLibrary(hlib);

}else
{

ReportError(...);

}

Спасибо за ответ! Хотя разобрался сам.

Вызываю ф-ию EnumDisplayDevicesA через LoadLibrary и GetProcAddress
напрямую из файла User32.dll. Все идет Ок, только когда я ее вызываю,
в этот момент появляется окно с debug information и содержит следующую инфу

The value of ESP was not properly saved across a function call. This is a result
of calling a function declared with one calling convention with a function pointer
with a different calling convention.

Но если нажать пропустить - программа продолжается дальше. Более того, эта функция
все-таки срабатывает и возвращает нормальные (верные) значения. Сразу же после
вызова этой ф-ии я вызываю GetLastError() и получаю значение 1400 &quot;Неверный
дескриптор окна&quot;.

Я пробовал несколько разных ф-ий таким макаром - получал то же самое.

В чем проблема?
[/quote]

426
28 августа 2002 года
Krivonos
112 / / 20.01.2000
Цитата:

On 2002-08-26 1052, Arestov wrote
[quote]
Спасибо за советы!
А вообще каким образом осуществить п.1 и п.2?



п1. видимо не нужен, у тя на VC6 всё должнобыть тип-топ, а вообще это можно сделать на сайте Microsoft. http//msdn.microsoft.com/downloads/default.asp

п2. ТЕОРИЯ

1. надо загрузить библиотеку LoadLibrary
2. получить указатель на ф-цию GetProcAddress
3. использовать ф-цию
4. выгрузить библиотеку FreeLibrary

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

Еще фишка в C++ строгие типы, по этому необходимо указатель возвращаемый GetProcAddress'ом привести к нужному типу, как обявить необходимый тип см. в ПРАКТИКА.
В Си это можно не делать.

ПРАКТИКА

// новый тип указатель на ф-цию EnumDisplayDevices
typedef BOOL (*LPFNENUMDISPLAYDEVICES)(
LPCTSTR lpDevice, // device name
DWORD iDevNum, // display device
PDISPLAY_DEVICE lpDisplayDevice, // device information
DWORD dwFlags // reserved
);

// сам указатель
LPFNENUMDISPLAYDEVICES pfnEnumDisplayDevices=NULL;

// дескриптор библиотеки
HMODULE hlib = LoadLibrary(&quot;user32.dll&quot;);

if (hlib)
{

pfnEnumDisplayDevices = (LPFNENUMDISPLAYDEVICES)GetProcAddress(hlib, &quot;EnumDisplayDevicesA&quot;);

if (pfnEnumDisplayDevices)
{
// используем
if (!pfnEnumDisplayDevices (
lpDevice, iDevNum, lpDisplayDevice, dwFlags))
{
ReportError(...);
}

}else
ReportError(...);

FreeLibrary(hlib);

}else
{

ReportError(...);

}

Спасибо за ответ! Хотя разобрался сам.

Вызываю ф-ию EnumDisplayDevicesA через LoadLibrary и GetProcAddress
напрямую из файла User32.dll. Все идет Ок, только когда я ее вызываю,
в этот момент появляется окно с debug information и содержит следующую инфу

The value of ESP was not properly saved across a function call. This is a result
of calling a function declared with one calling convention with a function pointer
with a different calling convention.

Но если нажать пропустить - программа продолжается дальше. Более того, эта функция
все-таки срабатывает и возвращает нормальные (верные) значения. Сразу же после
вызова этой ф-ии я вызываю GetLastError() и получаю значение 1400 &quot;Неверный
дескриптор окна&quot;.

Я пробовал несколько разных ф-ий таким макаром - получал то же самое.

В чем проблема?
[/quote]

380
28 августа 2002 года
Arestov
285 / / 20.09.2000
Попробуй объявить тип указателя на ф-цию как, именно с WINAPI:
typedef BOOL (WINAPI *LPFNENUMDISPLAYDEVICES)(
LPCTSTR lpDevice, // device name
DWORD iDevNum, // display device
PDISPLAY_DEVICE lpDisplayDevice, // device information
DWORD dwFlags // reserved
);

там с ESP тогда должно быть всё ок
577
28 августа 2002 года
Mozhay
81 / / 20.09.2000
Цитата:

On 2002-08-28 0041, Krivonos wrote
Все идет Ок, только когда я ее вызываю,
в этот момент появляется окно с debug information и содержит следующую инфу

The value of ESP was not properly saved across a function call. This is a result
of calling a function declared with one calling convention with a function pointer
with a different calling convention.



Попробуй объявить тип ф-ции так
typedef BOOL (WINAPI *LPFNENUMDISPLAYDEVICES)(LPCTSTR, DWORD, PDISPLAY_DEVICE, DWORD);

Собственно, WINAPI - это и есть &quot;тот самый&quot; calling convention, о котором говорится. Точнее, WINAPI - синоним __stdcall.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог