CTestWnd::CTestWnd()
{
RegisterWindowClass();
}
BOOL CTestWnd::RegisterWindowClass()
{
HINSTANCE hInstance;
WNDCLASS WindowClass;
BOOL bRetCode;
hInstance=AfxGetInstanceHandle();
if(!GetClassInfo(hInstance,
TESTWINDOW_CLASSNAME,&WindowClass))
{
WindowClass.style = CS_HREDRAW|CS_VREDRAW|
CS_DBLCLKS|CS_NOCLOSE;
WindowClass.lpfnWndProc = ::DefWindowProc;
WindowClass.cbClsExtra = 0;
WindowClass.cbWndExtra = 0;
WindowClass.hInstance = hInstance;
WindowClass.hIcon = NULL;
WindowClass.hCursor = LoadCursor(NULL,IDC_ARROW);
WindowClass.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
WindowClass.lpszMenuName = NULL;
WindowClass.lpszClassName = TESTWINDOW_CLASSNAME;
if(AfxRegisterClass(&WindowClass))
bRetCode=TRUE;
else
bRetCode=FALSE;
}
else
bRetCode=TRUE;
return bRetCode;
}
Проблема с hInstance в Extension DLLs (Release версии) ...
регистрируется оконный класс.
Код:
Также в этот класс добавлена обработка сообщения WM_CREATE, где при помощи
AfxGetInstanceHandle()/lpCreateStruct->hInstance и GetClassInfo() извлекается информация
оконного класса.
Код:
int CTestWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CWnd::OnCreate(lpCreateStruct) == -1)
return -1;
HINSTANCE hInstance;
hInstance=AfxGetInstanceHandle();
WNDCLASS ClassInfo;
CString Str;
Str.Format(_T("Instance=%d, Class=%s\nInstance=%d, Class=%s"),
lpCreateStruct->hInstance,lpCreateStruct->lpszClass,
hInstance,TESTWINDOW_CLASSNAME);
AfxMessageBox(Str);
if(GetClassInfo(lpCreateStruct->hInstance,
lpCreateStruct->lpszClass,
&ClassInfo))
AfxMessageBox(_T("Was found a window class !"));
else
AfxMessageBox(_T("Wasn't found a window class !"));
return 0;
}
{
if (CWnd::OnCreate(lpCreateStruct) == -1)
return -1;
HINSTANCE hInstance;
hInstance=AfxGetInstanceHandle();
WNDCLASS ClassInfo;
CString Str;
Str.Format(_T("Instance=%d, Class=%s\nInstance=%d, Class=%s"),
lpCreateStruct->hInstance,lpCreateStruct->lpszClass,
hInstance,TESTWINDOW_CLASSNAME);
AfxMessageBox(Str);
if(GetClassInfo(lpCreateStruct->hInstance,
lpCreateStruct->lpszClass,
&ClassInfo))
AfxMessageBox(_T("Was found a window class !"));
else
AfxMessageBox(_T("Wasn't found a window class !"));
return 0;
}
Также есть приложение типа Dialog Based, в котором создаёться окно при помощи класса из
длл-ки.
Теперь о проблеме. В VisualStudio 2003 всё работает отлично, как в DEBUG так и в RELEASE.
A в VisualStudio 2008/2010 в RELEASE, AfxGetInstanceHandle() и lpCreateStruct->hInstance
в dll-ке возвращают NULL. В чём может быть проблема?
Разобрался. Проблема была не в версии студии, а в настройках проекта (приложения использующего длл-ку) для RELEASE сборки. Почему-то в пункте "\C/C++\Code Generation\Runtime Library" была установлена опция "Multi-threaded Debug DLL (/MDd)" исправив на "Multi-threaded DLL (/MD)" всё заработало как надо.