FAQ:WinAPI VCPP

Материал из Весельчак У
Перейти к: навигация, поиск

Ответы на часто задаваемые вопросы по Windows API и VC++.

Составлено по материалам форума программистов.

Работа с COM и ActiveX.

  1. У меня есть наименование класса ActiveX. Мне необходимо узнать в каком файле он находится, и какой версии этот файл.
  2. VC++.NET. На форму установил ActiveX ListView. Как объявить класс и переменную для этого элемента?
  3. Как корректно перевести тип BSTR в CString и наоборот?
  4. Не могу обратиться к COM из дополнительного потока. Мне пишут - "CoInitialize() не вызвано".

Работа с DLL.

  1. Имеется DLL. В ней есть некоторые данные (скажем, массив int). Как сделать, чтобы переменные в DLL были одними и теми же для всех программ, использующих эту DLL? (Например, при загрузке DLL в массиве нет данных. Каждая программа добавит в массив новые данные.)
  2. Я написал DLL, которую используют несколько приложений. Всё работает, но когда происходит очередной вызов функции из DLL, почему то, данные в функции обнуляются. С чем это связано?
  3. Я создал простой проект DLL на VC++ 6.0. Все скомпилировалось нормально. Но в другой программе не могу вызвать функцию из DLL - программа не может найти функцию по имени.
  4. Каким образом можно установить значение переменной для вызывающего процесса или потока из своей собственной DLL?

Работа с Visual Studio.

  1. Как мне скопировать класс из одного проекта в другой? Код класса находится в файлах проекта в виде исходников.
  2. Что означают сообщения, которые студия выводит при компиляции, вроде таких: Loaded 'C:\WINDOWS\SYSTEM\WSOCK32.DLL', no matching symbolic information found?
  3. Как настроить количество пробелов в табуляции?
  4. Как автоматически расставить отступы?
  5. Поиск границ блока.
  6. Вертикальное выделение текста.
  7. Возможно ли использование файлов чистого С и С++ в одном проекте? Если да, то каковы должны быть настройки компилятора? А то ругается на Unexpected end of file while looking for precompiled header directive.

Вопросы отладки и выполнения программ.

  1. Имеются две программы, взаимодействующие между собой. Можно ли в MS VC6 запустить под отладчиком одновременно две программы?
  2. Почему на моем компьютере экзешник, созданный в MFC запускается, а на других компьютерах - нет? Требует какую-то dll.
  3. Каким способом exe файл может заменить самого себя?
  4. Как в проекте VC6 MFC программно получить путь, откуда был запущен экзешник (исполняемый модуль) самой программы?
  5. Как получить полный путь к экзешнику из самой программы?
  6. Как в отладчике Visual С++ просмотреть содержимое std::vector<string>?
  7. Как из программы определить каталог, в котором находится эта программа?
  8. Как получить короткое и длинное имя файла?
  9. Как программно установить переменные окружения?
  10. Как получить полное имя пользователя и организации, то есть то, что на диалоге system properties (горячая кнопка Win+Break) на закладке General перечислено под пунктом Registred To?
  11. Как получить список всех процессов, включая idle?
  12. Я запускаю экзешник при помощи ::ShellExecute(). Процедура тут же возвращает управление, а как дождаться, когда запущенный процесс завершится, только потом продолжить выполнение программы?

Вопрос по MFC.

  1. Если окно объекта, производного от CScrollView, имеет полосы прокрутки, то как определить координаты курсора мыши?
  2. Каким образом можно получить доступ к объекту в классе CFrameWnd из функций-членов класса CMyView?
  3. Как программно расположить один CDialogBar под другим при их вертикальном расположении?
  4. Как добавить возврат каретки к переменной типа CString?
  5. Как в диалоговом MFC приложении добавить accelerator'ы? В редакторе ресурсов создаю, а применить не могу.
  6. Как с помощью CFileDialog разрешить выбирать только папки?
  7. Как в CDialog-based классе получить коды клавиш, которые нажимает пользователь? Пробовал добавлять обработчики OnChar() и OnKeyDown(), но эти обработчики вообще не вызываются.
  8. Нужно удалить контрол (CComboBox) из диалога. Причём это надо сделать из обработчика сообщения этого контрола.
  9. Как динамически подгрузить ресурсы к ATL проекту?
  10. Как динамически подгрузить ресурсы к MFC проекту?
  11. Где лучше устанавливать начальные значения элемента CComboBox?
  12. Как вызвать метод главного окна (если используется класс CMainFrame) из любого места программы?
  13. Как запретить появление полос прокруток на форме класса CFormView, когда пользователь делает размер главного окна меньше размера формы?
  14. Как конвертировать массив char[] в CString?
  15. Как зарезервировать в CString буфер нужной длины?
  16. Как убрать главное меню из окна CMainFrame?
  17. Как сделать всплывающую подсказку для класса CWnd и классов, от него производных?
  18. Как узнать, что пользователь меняет текст в приложении на основе CRichEditView?
  19. Чем отличается метод CArray::GetSize от метода CArray::GetCount?
  20. Как поменять иконку у элемента item в CListCtrl?
  21. Как в CString можно найти или вырезать часть строки?
  22. Имеется класс, производный от CDialog. Когда диалог в фокусе, нажатие на Enter или Esc приводит к закрытию диалога. Как это запретить?
  23. Почему список CComboBox не выпадает, хотя клавишами "вверх" и "вниз" значения перебираются?
  24. Как закрасить фон окна CWnd?
  25. Как узнать, когда после запуска приложение уже готово к работе?
  26. Как в MFC Grid control отобразить картинку в ячейке?
  27. Как при помощи IPicture отобразить картинку из файла?
  28. Как получить доступ к элементам управления панели CReBar, принадлежащей классу MainFrame?
  29. Как обработать сообщения, которые приходят к элементу управления?
  30. Как узнать количество установленных в CListCtrl столбцов?
  31. Почему не вызывается OnUpdate для пунктов меню (не получается ни затенить, ни отметку поставить)?

Общие вопросы GUI с Win32 API.

  1. Если известны абсолютные координаты точки на экране, как перевести эти координаты в относительные координаты некоторого известного окна?
  2. Когда я вывожу две строки (одна под другой), то положение символа в строках зависит от ширины символа, а хотелось бы, чтобы символы располагались один под другим.
  3. Я рисую новую иконку в ресурсах проекта VC6, но после запуска программы показывается старая иконка. Что делать?
  4. Как создать иконку в области уведомлений (системном трее)? Как определить, какие действия производит с иконкой пользователь? Как сделать анимацию иконки в трее? Как удалить иконку?
  5. Как сменить иконку у диалога или мейнфрейма? (поставить свою иконку из ресурсов)
  6. Как получить иконку приложения?
  7. Как создавать всплывающие подсказки (ToolTip)?
  8. Что делает функция ScrollWindow()?
  9. Как узнать значение цвета пиксела в определенной точке экрана (не окна формы)?
  10. Как загрузить и показать один из стандартных курсоров?
  11. Как запретить пользователю закрыть программу нажатием на кнопку с крестиком?
  12. Как создать на диалоге группу элементов "RadioButton" и как задать порядок их обхода клавишей Tab?
  13. Как перевести RichEdit в режим замены символов?
  14. Как под Windows отслеживать изменение файла?
  15. Как передать больше одного параметр в процедуру потока?
  16. Как работающая программа может определить, что пользователь завершает работу Windows?
  17. Как загрузить текстовую строку из ресурса?
  18. Как переключить раскладку клавиатуры в другом (активном) процессе?
  19. Как получить хендл элемента управления, зная его идентификатор?
  20. Как из дочернего окна закрыть приложение?
  21. Как выводят картинку-логотип (splash screen) при запуске программы?
  22. Как работать с буфером обмена?
  23. Как изменить цвет рамки приложения?
  24. Как программно поменять настройки Internet Explorer?
  25. В чём разница между сообщениями WM_MOVE и WM_MOVING?
  26. Как определить первый свободный ID, который можно использовать при динамическом создании элементов управления?
  27. Как определить, что курсор мыши вышел за границу окна?
  28. Как отобразить на элементах управления промежуточные результаты длительных вычислений?
  29. Когда размещаю компонент RichEdit на форму, программа запускается и тут же закрывается. Что здесь не так?
  30. Как сделать обработчик сообщения для нескольких элементов управления сразу?
  31. Как получить доступ к графическим ресурсам элементов текущей темы оформления Windows?
  32. Как сделать, чтобы у окна был черный фон?
  33. Как удалить из меню пункт?
  34. Как добавить пункт в меню?
  35. Как в диалог добавить меню?
  36. Как в главном окне отключить системное меню (в левом верхнем углу) и кнопки (в правом верхнем углу)?
  37. Как запретить пользователю нажать на кнопку?
  38. Как позволить пользователю начать ввод новой строки в многострочном поле редактирования?
  39. Как сделать, чтобы при выпадении списка у ComboBox была не одна строка, а больше? Вроде все свойства покрутил, не помогает: вместо выпадающего списка - одна строка и скролл.

Контекст устройства (DCD), рисование и печать.

  1. Как вывести на печать то, что я нарисовал в контексте устройства (класс CDC)?
  2. Как нарисовать линию или прямоугольник на контексте устройства (CDC)? Как выбрать цвет и толщину линии?
  3. Как сменить шрифт при выводе текста на CDC?
  4. Как нарисовать прямоугольник с вертикальным цветовым градиентом?
  5. Как при выводе текста на контекст устройства определить ширину и высоту выведенных символов текста в пикселах?

Работа с памятью.

  1. Как заполнить блок памяти определённым значением?
  2. Как сравнить два блока памяти на равенство значений?
  3. Как скопировать блок памяти?

Общие вопросы программирования.

  1. Как обратиться к переменной или методу базового класса?
  2. Как записать данные в файл?
  3. Как создать в VC++ exe-шник меньше 24-х килобайт?
  4. Имеется класс Class1, содержащий член типа "Class2*". А в Class2 имеется член типа "Class1*". Компилятор выдаёт ошибку. Что надо делать?
  5. Я написал в VC++ простейший макрос, где невозможно ошибиться, а компилятор всё же выдаёт ошибку.
  6. У меня в программе имеется процедура, которая производит очень много вычислений. Как сделать так, чтобы пользователь мог прервать процесс вычислений?
  7. Как производится конвертация из кодировки UTF8 в 1251 и наоборот?
  8. Как работать с базой данных Access из программы на VC.NET?
  9. Есть ли какой-нибудь макрос в VC7, возвращающий строку вида ClassName::FunctionName внутри соответствующей функции?
  10. Когда я запускаю программу, все надписи на русском языке теряются - показываются вопросики. Что делать?
  11. Как открыть проекцию файла в память и как с ней работать?
  12. Сериализация данных в C++.