проблемы с функциями win 2000
GetWindowInfo, EnumDisplayDevices, а также структурка WINDOWINFO. компилятор выдает сообщение
такая-то функция - undeclared identifier. Я смотрел - все они описаны в
файле <winuser.h>, заголовки ф-ий имеются в \system\user32.dll - но! - в файле user32.lib
ничего такого нет. В чем возможная проблема? Может нужно поставить новый winuser.lib? И если да,
то где его можно взять?
Заранее благодарен
#if(WINVER >= 0x0500)
Из-за него весь интересующий кусок и вырезается препроцессором. Выход простой - перед #include <windows.h> поставить
#define WINVER 0x0500
И все заработает.
А если проще, то поищи в MSDN "Using the SDK Headers" (с кавычками, чтобы было поменьше вариантов). Там все написано.
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
Получаю вот такое сообщение
myfile.obj error LNK2001 unresolved external symbol [EMAIL]__imp__EnumDisplayDevicesA@16[/EMAIL]
имеется ввиду если использую ф-ию EnumDisplayDevices.
Мне кажется проблема с файлом user32.lib
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
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).
Есть два выхода:
1. Проапдейтить Platform SDK.
2. Грузить ф-цию EnumDisplayDevices динамически, т.е. через LoadLibrary, GetProcAddress, т.к. в User32.dll она есть (точнее, есть EnumDisplayDevicesA и EnumDisplayDevicesW).
///////////////////////
Спасибо за советы!
А вообще каким образом осуществить п.1 и п.2?
Спасибо за советы!
А вообще каким образом осуществить п.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("user32.dll");
if (hlib)
{
pfnEnumDisplayDevices = (LPFNENUMDISPLAYDEVICES)GetProcAddress(hlib, "EnumDisplayDevicesA");
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("user32.dll");
if (hlib)
{
pfnEnumDisplayDevices = (LPFNENUMDISPLAYDEVICES)GetProcAddress(hlib, "EnumDisplayDevicesA");
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 "Неверный
дескриптор окна".
Я пробовал несколько разных ф-ий таким макаром - получал то же самое.
В чем проблема?
[/quote]
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("user32.dll");
if (hlib)
{
pfnEnumDisplayDevices = (LPFNENUMDISPLAYDEVICES)GetProcAddress(hlib, "EnumDisplayDevicesA");
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 "Неверный
дескриптор окна".
Я пробовал несколько разных ф-ий таким макаром - получал то же самое.
В чем проблема?
[/quote]
typedef BOOL (WINAPI *LPFNENUMDISPLAYDEVICES)(
LPCTSTR lpDevice, // device name
DWORD iDevNum, // display device
PDISPLAY_DEVICE lpDisplayDevice, // device information
DWORD dwFlags // reserved
);
там с ESP тогда должно быть всё ок
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 - это и есть "тот самый" calling convention, о котором говорится. Точнее, WINAPI - синоним __stdcall.