мда... любой нормальный человек под NT будет писать на юникоде, по-крайней мере критические к скорости части... а потом можно получить "подарок" в виде поддержки 9х (умирал бы уже он в самом деле :) ).
Всё это сильно напоминает перехват API вызовов по Рихтеру, одно радует что в чужой процесс лезть не надо:)
.
.
.
кстати у вас действительно такие окошки цвета чернобыльской тыквы?))) глаза ж сломать можно....
и вот тут опечатка: "...Четвертый параметр – указатель не функцию..."
Интересно, а как быть, если надо сделать заставить работать UpdateResource под Win9X? У меня при компиляции моего MFC-проекта выдает сообщение
Linking...
LINK : warning LNK4098: defaultlib "LIBCMT" conflicts with use of other libs; use /NODEFAULTLIB:library
unicows.lib(thunk_user32_UnregisterClassW.obj) : fatal error LNK1103: debugging information corrupt; recompile module
В статье приведен неправильный способ переопределения указателя на функцию, эмулирующую юникодную функцию для неуникодной версии Windows. На самом деле надо переопределить переменную Unicows_xxxW (а не функцию), в которой хранится указатель на соответствующую реализацию:
static HANDLE AddPrinterOverride(LPTSTR *pName, DWORD Level, LPBYTE pPrinter)
{
int iRes = ::MessageBox(NULL, L"Hello from AddPrinterOverride", NULL, MB_OK);
return NULL;
}
extern "C" FARPROC Unicows_AddPrinterW = (FARPROC)&AddPrinterOverride;
Еще хочу заметить, что пример в MSDN c функцией LoadCursorW содержит ошибку — там написано просто "extern FARPROC", надо писать "extern "C" FARPROC".
Здравствуйте, Павел Блудов, Вы писали:
ПБ>Статья:
ПБ>Авторы:
ПБ> Павел Блудов
ПБ>Аннотация:
ПБ>В статье рассматриваются способы создания уникодных приложений, способных выполняться в Windows9x/Me
В статье есть 2 маленькие ошибки, хотя в исходниках, что идут со статьей, их нет:
1.
Неправильно:
while(pNamesTable->u1.AddressOfData)
{
... // нет инкремента pNamesTable++
}
Правильно:
for(;pNamesTable->u1.AddressOfData; pNamesTable++)
2. ( Скорее всего это не ошибка, а — недописка )
В той части статьи, где рассказывается о "Проблеме отложенной загрузки",
необходимо сказать, что метод _UnicowsInit тоже изменился:
Было:
_UnicowsInit()
{
...
// Запонимаем таблицу имен и адресов
g_pdwOrd = MakePtr(LPWORD, g_hModuleUnicows, pExpDir->AddressOfNameOrdinals);
g_pdwNames = MakePtr(LPDWORD, g_hModuleUnicows, pExpDir->AddressOfNames);
g_pdwAddrs = MakePtr(LPDWORD, g_hModuleUnicows, pExpDir->AddressOfFunctions);
g_dwNames = pExpDir->NumberOfNames;
return TRUE;
}
Стало:
_UnicowsInit()
{
...
// Запонимаем таблицу имен и адресов
g_pdwOrd = MakePtr(LPWORD, g_hModuleUnicows, pExpDir->AddressOfNameOrdinals);
g_pdwNames = MakePtr(LPDWORD, g_hModuleUnicows, pExpDir->AddressOfNames);
g_pdwAddrs = MakePtr(LPDWORD, g_hModuleUnicows, pExpDir->AddressOfFunctions);
g_dwNames = pExpDir->NumberOfNames;
_RealGetProcAddress = GetProcAddress;
return TRUE;
}