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

Ваш аккаунт

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

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

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

Проблема с hInstance в Extension DLLs (Release версии) ...

433
12 октября 2010 года
AlexII
86 / / 13.10.2003
Есть длл-ка в которой находиться класс производный от CWnd. В конструкторе этого класса

регистрируется оконный класс.

Код:
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;
}


Также в этот класс добавлена обработка сообщения 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;
}


Также есть приложение типа Dialog Based, в котором создаёться окно при помощи класса из

длл-ки.

Теперь о проблеме. В VisualStudio 2003 всё работает отлично, как в DEBUG так и в RELEASE.

A в VisualStudio 2008/2010 в RELEASE, AfxGetInstanceHandle() и lpCreateStruct->hInstance

в dll-ке возвращают NULL. В чём может быть проблема?
433
25 января 2011 года
AlexII
86 / / 13.10.2003
Разобрался. Проблема была не в версии студии, а в настройках проекта (приложения использующего длл-ку) для RELEASE сборки. Почему-то в пункте "\C/C++\Code Generation\Runtime Library" была установлена опция "Multi-threaded Debug DLL (/MDd)" исправив на "Multi-threaded DLL (/MD)" всё заработало как надо.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог