Войти
Sergei ShaykinФорум

Работаем с MS Visual Studio. (комментарии)

Страницы: 1 2 Следующая »
#0
20:16, 21 окт 2006

Работаем с MS Visual Studio. (комментарии)

Это сообщение сгенерировано автоматически.

#1
20:16, 21 окт 2006

Привет!

Хотелось бы получить мнение сведущего человека. 

У меня следующая ситуация: имеется код движка на C++. Хочется написать к нему расширение в виде DLL на C++. Таким образом, dll-ка должна иметь доступ ко всем *.cpp файлам в движке. Последний на винчестере расположен во множестве папок, например:

engine/
engine/core
engine/math
engine/rendering

Я создал проект для расширения и добавил его к существующему (чтобы все было навиду). Вот и сам вопрос: можно ли обеспечить вышеупомянутый доступ к исходникам "не через добавление их в проект с расширением"?

#2
9:06, 26 окт 2006

Уточняю, у тебя есть движок, который использует cpp файлы, к нему ты пишешь dll, которая должна компилировать те же самые файлы cpp? Если так, то ты не верно делаешь. Модули должны различаться именно cpp файлами. Связка идёт через интерфейсы - функции или виртуальные классы, например.

#3
19:15, 13 дек 2006

Привет всем!
Я собственно по какому поводу - в стать логическая ошибка (при сборке приложение жрет все ресурсы процессора). Решение проблемы оказалась простым - заменить

while(msg.message!=WM_QUIT)
{
.....................
if(GetMessage(&msg, NULL, 0, 0))
  {
  .....................
  }
.....................
}

на:

if(msg.message!=WM_QUIT)
{
.....................
while(GetMessage(&msg, NULL, 0, 0))
  {
  .....................
  }
.....................
}

Очень большая прозьба исправьте пожалуйста. Сам был в шоке от загрузки ЦП на 100% и еле-еле нашёл эту логическую ошибку.

#4
19:26, 13 дек 2006

DjoNIK
Пример в статье не для всех типов приложений, а для игровых, которым нужно перерисовывать постоянно выводимый кадр независимо от того, приходят сообщения от Виндавса или нет. Поэтому и занимает 100%.

offtop:
Правда, о самом цикле в целом: думаю, было бы правильно, чтобы игровой цикл не содержал в условии и в открытом виде виндозную обработку. Она должна происходить в какой-то функции, вызываемой из тела функции.

Прошло более 11 месяцев
#5
23:58, 3 дек 2007

Мне понравилось. :)

Да, статья проста и описывает только первый шаг.
Но именно такая статья иногда нужна человеку, который переходит на Visual C++. По себе знаю - долго не мог отказаться от Delphi. Всё потому что вместо вот такой коротенькой статьи-обзора мне подсовывали толмуты типа Рихтера и Петзольда. И глядя на них, всё меньше было желания переходить на виж.

Теперь бы ещё несколько статей по ключевым моментам WinAPI и по ресурсам добавить - это будет хорошей основой. Так сказать, отправной точкой для дальнейшего развития. (Эх, шо-то я губу раскатал...)

Вобщем за статью - 5 баллоф!

#6
12:22, 1 мая 2008

Здраствуйте, у меня проблемма с запускои примера.

 wndclass.hIcon = LoadIcon (hInstance, szAppName); 

error C2664: 'LoadIconW' : cannot convert parameter 2 from 'const char *' to 'LPCWSTR'

 wndclass.lpszMenuName  = szAppName;
 wndclass.lpszClassName = szAppName; 

error C2440: '=' : cannot convert from 'const char *' to 'LPCWSTR'

Всё делал под MS Visual C++ 2008, видно ему не подходит формат данных которые я ему даю, помогите, пожалуйста.

#7
12:43, 1 мая 2008

а всё проблемма решилась ALT+F7->Configuration Properties->Character Set->Not Set

Прошло более 1 года
#8
17:04, 1 июля 2009

Засунул код в visual c++ 6.5 и он выдает ошибку: error c2146: syntax error : messing ';' before identifier 'CreateWindowExA'.  Че за ерунда все прорыл нигде такой строчки найти не могу! Че делать?

#9
17:38, 1 июля 2009

КЕН
windows.h подключил?

#10
17:40, 1 июля 2009

Да, подключил. И версию я неправильно написал, там 6.0

#11
13:14, 2 июля 2009

КЕН
а тупо по тексту ошибки точки с запятой нигде не пропустил возле функции CreateWindow(...) ?

#12
16:57, 2 июля 2009

А-а-а-х если бы, давно у же нашел. Хрен его знает. Ладно смысл ясен и на том спасибо.

Прошло более 2 лет
#13
9:50, 7 мая 2012

Очень интересная и полезная статья. Хочу перевести все это на ООП и дальше в OpenGL с таким подходом пойти.
В объекте регистрируется класс окна, настраиваются стиль и реакция на OpenGL, создается само окно. Запускается обработчик сообщений. В общем все, как в статье.
Так вот при регистрации у меня не удается класс окна принять мою функцию обработки сообщений. Выполнена она у меня как метод того же объекта.
Вроде и параметры все на месте, и __stdcall. А компилятор выдает

приведение типов: невозможно преобразовать 'overloaded-function' в 'WNDPROC'
1>        Конечному типу не соответствует ни одной функции с данным именем в области видимости

Не могу понять в чем дело. Судя по ошибке, функция типа перегружена, но самом деле и в заголовочном файле, и в реализации одно и то же написано, везде четыре параметра (HWND, UINT, WPARAM, LPARAM). Может с указателем не так работаю - пробовал и просто по имени (благо, что внутри класса), и по this->, и по по this::. Ответ один у компилятора. Может кто-нить объяснить, в чем я ошибся.

LRESULT WINAPI simpleWindow::windowProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
  switch (msg)
  {...}
  return CallWindowProc( (WNDPROC)DefWindowProc, windowID, msg, wParam, lParam );
}

HWND simpleWindow::createWindow(LPCSTR pWindowName, int nWidth, int nHeight, int nCmdShow, bool bIsOpenGL)
{
  WNDCLASS wndClass;
  //регистрируем класс окна
  wndClass.style      = 0;
  wndClass.lpfnWndProc  = (WNDPROC)(this->windowProc);
  wndClass.cbClsExtra    = 0;
...
}
 

Полный код
simpleWindow.h
simpleWindow.cpp
main.cpp

#14
12:38, 7 мая 2012

>Очень интересная и полезная статья.
Меганекропостинг. Эта статья была написана почти 10 с половиной лет назад.

По поводу вопроса. Функции-члены класса имеют соглашение _thiscall. Туда передаётся скрытый параметр this. Поэтому она не совпадает с сигнатурой WNDPROC. Тебе придётся сделать глобальную или статическую оконную процедуру, которая по дескриптору окна определит адрес объекта окна. По нему уже можно будет вызвать собственную оконную процедуру. Для этого надо привязать адрес объекта к самому окну. Окно нужно создавать функцией CreateWindowEx и передать ей this в последнем параметре. Его мы извлечём в статической оконной процедуре, которая должна выглядеть так:

//Оконная процедура для всех окон класса Window
LRESULT _stdcall Window::StaticWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
  if(uMsg==WM_NCCREATE)
  {
    Window* This=(Window*)((CREATESTRUCT*)lParam)->lpCreateParams;
    SetWindowLongPtrA(hWnd, GWLP_USERDATA, (LONG_PTR)This);
    return 1;
  }
  Window* This=(Window*)GetWindowLongPtrA(hWnd, GWLP_USERDATA);
  if(!This) return DefWindowProc(hWnd, uMsg, wParam, lParam);
  return This->MyWndProc(uMsg, wParam, lParam);
}
Страницы: 1 2 Следующая »
Sergei ShaykinФорум

Тема в архиве.