Форум программистов, компьютерный форум, киберфорум C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
Другие темы раздела
C++ WinAPI Грамотная эмуляция нажатия мыши https://www.cyberforum.ru/ win-api/ thread2480129.html
Здравствуйте, использую нажатие ЛКМ в таком виде: mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0); mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0); В WinApi я не очень разбираюсь в механизмах общения окна с УВВ. Чем такой программный вариант нажатия из консоли отличается от настоящего "живого" нажатия ЛКМ? Может ли активное окно приложения отследить, откуда было получено это событие, получив...
Текстовый редактор C++ WinAPI
Привет. Кто ни будь, может мне рассказать как работает текстовый редактор изнутри, типа как работает отмена действия, сохранение, файл весь загружать в память или часть, или вообще его загружать не надо? Я надеюсь что кто ни будь меня поймёт, я просто "мастерски" изложил свой вопрос. Ну или может есть какие ни будь исходники редактора(но желательно не с Qt и всяких билдеров).
C++ WinAPI Как узнать тип сетевого диска (dvd-проигрывателя)? https://www.cyberforum.ru/ win-api/ thread2479523.html
Добрый день. Я не программирую на C++, поэтому не смогу воспользоваться инструментами языка C++. Я сделал общий доступ к dvd-проигрывателю в локальной сети. Функция "GetDriveType" сообщает, что это сетевой диск (4). С помощью какой api-функции можно узнать, что это dvd-проигрыватель? Задача: узнать информацию о сетевом диске и сообщить эту информацию юзеру. Никаких действий не нужно...
C++ WinAPI Инжект своей длл в Lsass.exe (Уровень сложности "Ультра") Я поспорил с другом, что смогу обойти его драйверную защиту на его приложении, как видите спор я практически проиграл, сказал ему, что доделываю обход. Создавать свой драйвер для обхода его драйвера мне не хочется, ловить хуки его драйвера и приложения тоже не хочется, но зато есть такой системный процесс, как lsass.exe, я нашел способ получить хандлы процесса и отдебажить его, но создать поток в... https://www.cyberforum.ru/ win-api/ thread2479126.html
GUI на win api C++ WinAPI
Доброго времини суток всем! У меня есть калькулятор но он консольный, я решил переписать его и сделать gui. Собственно у меня возникла проблема! Я понял как создавать окна на win api, но не понял как в окне располагать элементы, кнопки, эдиты и тд, без визуальных средств. У GNOME есть Glade, а есть ли что то подобное для visual studio? Или всё надо делать на шару. И подскажите , можно...
C++ WinAPI Передача строки в качестве аргумента потоку Создаю массив handle'ов HANDLE threads; Есть массив, состоящий из 5 символов "ABCDE" char symb; Создаю потоки циклом https://www.cyberforum.ru/ win-api/ thread2478602.html
C++ WinAPI MQTT + ReadProcessMemory Добрый день, господа! Имеется исходный код, читающий заданные ячейки памяти других процессов через ReadProcessMemory (WinAPI), хотелось бы транслировать эти данные в MQTT топики и хранить настройки и список ячеек-топиков в файле. С си довольно мало общался, нужна ваша помощь! https://www.cyberforum.ru/ win-api/ thread2477506.html CryptoAPI | РСА шифрование C++ WinAPI
Приветствую всех. Пытаюсь шифровать текст при помощи RSA. Имеются следующие вопросы : 1. Дабы узнать размер данных в зашифрованном виде - я передаю в функцию CryptEncrypt изначальный размер данных, пример : CryptEncrypt(hCryptKey, NULL, true, 0, NULL, &dwEnc, 0) В переменную dwEnc попадает размер данных в зашифрованном виде. И этот размер статичен в зависимости от размера рса ключей.
C++ WinAPI Дочернее окно то видимо, становится невидимым Пишу в эту ветку, т.к. вопрос по winapi, моё приложение на C#. Делаю окно дочерним (браузер Chromium), после чего выравниваю его по краям с помощью MoveWindow: MoveWindow(hWndDocked, -10, -80, pannel.Width+10, pannel.Height+75, true); Всё выравнивается без проблем, но после выравнивая окно часто становится невидимым, просто белый фон, если ничего не выравнивать, то окно всегда видимо и... https://www.cyberforum.ru/ win-api/ thread2477172.html C++ WinAPI Как узнать, допустимое количество символов в полном имени папки или файла? Добрый день. Как узнать, допустимое количество символов в полном имени папки или файла? Например, я сформировал полное имя для папки. С помощью какой api-функции я могу узнать, допустимая длина у этого полного имени или нет? При этом, функция CreateDirectory может создать папку, в полном имени которой будет много символов и вследствие этого папку нельзя будет удалить (например клавишей... https://www.cyberforum.ru/ win-api/ thread2477112.html
C++ WinAPI Получение информации о дисках циклом
получаю диски через GetLogicalDrives, хранятся в массиве unsigned char disks; как получать информацию о дисках из этого массива? for (int i = 0; i < dlen; i++) { char VolumeNameBuffer; char FileSystemNameBuffer; unsigned long VolumeSerialNumber;
C++ WinAPI Где учить C++: WinAPI Хочу научиться делать приложения под винду, но до сих пор не могу найти материал для изучения, на этом форуме ранее кидали Windows API tutorial, это ответило на некоторые вопросы, но я до сих пор не понимаю как делать структуру приложения и т.д., может есть всё-таки какие-то курсы, книги с практикой
90 / 88 / 33
Регистрация: 20.07.2016
Сообщений: 403
0

Нестатические STL контейнеры очищаются - C++ WinAPI - Ответ 13703878

06.07.2019, 15:47. Показов 1313. Ответов 2
Метки (Все метки)

Author24 — интернет-сервис помощи студентам
Прикрепил к посту простенький проект:
CException.h - класс для исключений
CString.h - для работы со строками
CApplication.h+CApplication.cpp - запускают цикл обработки сообщений
CWindow.h+CWindow.cpp - наше окно

Суть проблемы: в классе окна есть нестатический вектор символов, который заполняется при получении сообщения WM_SIZE, в сообщении WM_PAINT отображается содержимое вектора. Если, не изменяя размер окна, перетянуть какую-то его часть за пределы десктопа, а потом вытянуть назад, мы получаем сообщение WM_PAINT (кусок окна то открылся, стало быть нужно его перерисовать) с пустым вектором!!!
Программа падает в 97 строке CWindow.cpp (функция paintEvent), при работе с m_vChars, который является пустым...

Сам вектор в коде не очищается и заполняется лишь в WM_SIZE. Если сделать его статическим - все ок.
В чем может быть проблема???

C++Выделить код
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#ifndef CEXCEPTION_H
 
#define CEXCEPTION_H
 
#include "CString.h"
 
//=================================================================================
class CException
{
  private:
    CString m_strDescription;
 
  public:
    CException (const CString& strDescription): m_strDescription(strDescription)
    {  }
 
    CString what () const
    { return m_strDescription; }
};
 
//=================================================================================
#endif
C++Выделить код
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#ifndef CSTRING_H
 
#define CSTRING_H
 
#include <string>
 
//=================================================================================
#ifdef UNICODE
 
using CString = std::wstring;
 
template <typename T>
CString ToCString (const T& tVal)
{ return std::to_wstring(tVal); }
 
#else
 
using CString = std::string;
 
template <typename T>
CString ToCString (const T& tVal)
{ return std::to_string(tVal); }
 
#endif
 
 
//=================================================================================
#endif
C++Выделить код
1
2
3
4
5
6
7
8
9
10
11
12
13
#ifndef CAPPLICATION_H
 
#define CAPPLICATION_H
 
//=================================================================================
class CApplication
{
  public:
    static int exec ();
};
 
//=================================================================================
#endif
C++Выделить код
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include "CApplication.h"
#include <windows.h>
 
//=================================================================================
int CApplication::exec()
{
  MSG msg;
  int iRet = 0;
 
  while ((iRet = GetMessage(&msg, nullptr, 0, 0)) != 0)
  {
    if (iRet == -1)
      return iRet;
 
    TranslateMessage(&msg);
    DispatchMessage(&msg);
  }
  return msg.wParam;
}
C++Выделить код
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#ifndef CWINDOW_H
 
#define CWINDOW_H
 
//=================================================================================
#include <windows.h>
#include "CString.h"
#include <map>
#include <vector>
 
//=================================================================================
class CWindow
{
  private:
  // типы
    using EventFunc = void (WPARAM, LPARAM);
 
  // данные
    static const CString m_strClassName;
    static std::map<UINT, void (CWindow::*) (WPARAM, LPARAM)> m_mEvents;
 
    HWND m_hwnd = nullptr;
 
    std::vector<TCHAR> m_vChars;
    int m_cxChar   = 0,
        m_cyChar   = 0,
        m_cxBuffer = 0,
        m_cyBuffer = 0,
        m_xCaret   = 0,
        m_yCaret   = 0;
 
  // реализация
    void createEventMap ();
 
    static LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
 
    EventFunc createEvent;
    EventFunc resizeEvent;
    EventFunc paintEvent;
    EventFunc destroyEvent;
 
  public:
    CWindow ();
 
    void show ();
};
 
//=================================================================================
#endif
C++Выделить код
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
#define NOMINMAX
 
#include "CWindow.h"
#include "CException.h"
#include <algorithm>
 
//=================================================================================
// static data
const CString CWindow::m_strClassName = TEXT("Typer");
std::map<UINT, void (CWindow::*) (WPARAM, LPARAM)> CWindow::m_mEvents;
 
//=================================================================================
CWindow::CWindow ()
{
  if (m_mEvents.empty())
  {
    createEventMap();
 
    WNDCLASSEX wnd = {
                       sizeof(wnd),
                       CS_HREDRAW | CS_VREDRAW,
                       WndProc,
                       0, 0,
                       GetModuleHandle(0),
                       LoadIcon(nullptr, IDI_APPLICATION),
                       LoadCursor(nullptr, IDC_ARROW),
                       static_cast<HBRUSH>(GetStockObject(WHITE_BRUSH)),
                       nullptr,
                       m_strClassName.c_str(),
                       LoadIcon(nullptr, IDI_APPLICATION)
                     };
    if (!RegisterClassEx(&wnd))
      throw CException(TEXT("RegisterClassEx"));
  }
 
  m_hwnd = CreateWindow(
                         m_strClassName.c_str(),
                         m_strClassName.c_str(),
                         WS_OVERLAPPEDWINDOW,
                         CW_USEDEFAULT, CW_USEDEFAULT,
                         CW_USEDEFAULT, CW_USEDEFAULT,
                         nullptr, nullptr,
                         GetModuleHandle(0),
                         this
                       );
  if (!m_hwnd)
    throw CException(TEXT("CreateWindow"));
}
 
//=================================================================================
void CWindow::createEventMap ()
{
  m_mEvents.emplace(WM_CREATE, &CWindow::createEvent);
  m_mEvents.emplace(WM_SIZE, &CWindow::resizeEvent);
  m_mEvents.emplace(WM_PAINT, &CWindow::paintEvent);
  m_mEvents.emplace(WM_DESTROY, &CWindow::destroyEvent);
}
 
//=================================================================================
void CWindow::createEvent (WPARAM, LPARAM)
{
  HDC hdc = GetDC(m_hwnd);
 
  SelectObject(hdc, GetStockObject(SYSTEM_FIXED_FONT));
  TEXTMETRIC tm;
  GetTextMetrics(hdc, &tm);
 
  m_cxChar = tm.tmAveCharWidth;
  m_cyChar = tm.tmHeight;
 
  ReleaseDC(m_hwnd, hdc);
}
 
//=================================================================================
void CWindow::resizeEvent (WPARAM, LPARAM lParam)
{
  m_cxBuffer = std::max(1, LOWORD(lParam) / m_cxChar);
  m_cyBuffer = std::max(1, HIWORD(lParam) / m_cyChar);
 
  m_vChars.assign(m_cxBuffer * m_cyBuffer, TEXT(' '));
 
  m_xCaret = 0;
  m_yCaret = 0;
 
  if (m_hwnd == GetFocus())
    SetCaretPos(m_xCaret * m_cxChar, m_yCaret * m_cyChar);
}
 
//=================================================================================
void CWindow::paintEvent (WPARAM, LPARAM)
{
  PAINTSTRUCT ps;
  BeginPaint(m_hwnd, &ps);
 
  SelectObject(ps.hdc, GetStockObject(SYSTEM_FIXED_FONT));
  for (unsigned j = 0; j != m_cyBuffer; ++j)
    TextOut(ps.hdc, 0, j * m_cyChar, m_vChars.data() + j * m_cxBuffer, m_cxBuffer);
 
  EndPaint(m_hwnd, &ps);
}
 
//=================================================================================
void CWindow::destroyEvent (WPARAM, LPARAM)
{ PostQuitMessage(0); }
 
//=================================================================================
LRESULT CALLBACK CWindow::WndProc (HWND hwnd, UINT uiMsg, WPARAM wParam, LPARAM lParam)
{
  if (uiMsg == WM_NCCREATE)
    SetWindowLongPtr(hwnd, GWL_USERDATA,
                     reinterpret_cast<LONG_PTR>(reinterpret_cast<CREATESTRUCT*>(lParam)->lpCreateParams));
  else
  {
    auto pWindow = reinterpret_cast<CWindow*>(GetWindowLongPtr(hwnd, GWL_USERDATA));
    if (pWindow)
    {
      auto it = m_mEvents.find(uiMsg);
      if (it != m_mEvents.end())
      {
        (pWindow->*it->second)(wParam, lParam);
        return 0;
      }
    }
  }
  return DefWindowProc(hwnd, uiMsg, wParam, lParam);
}
 
//=================================================================================
void CWindow::show ()
{
  ShowWindow(m_hwnd, SW_NORMAL);
  UpdateWindow(m_hwnd);
}
P.S: для тех кто все таки посмотрит код - такая же проблема и с std::map, которая хранит указатели на функции-обработчики сообщений, если ее сделать не статической и получать к ней доступ через указатель this в WndProc, программа тоже упадет, потому что в какой-то момент map вдруг становится пустым...

Вернуться к обсуждению:
Нестатические STL контейнеры очищаются C++ WinAPI
Вложения
Тип файла: rar Project.rar (3.0 Кб, 1 просмотров)
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.07.2019, 15:47
Готовые ответы и решения:

[C++11] STL unordered контейнеры
Думаю, проще всего мою проблему/задачу описать псевдокодом. class MyClass { void...

Контейнеры STL
Кто знает где найти информацию по поводу стандартных контейнеров STL? Интересует не то, как их...

STL-контейнеры
Как заставить работать в Qt стандартные stl-контейнеры? Может что-то не то пишу? #include...

Начала STL и контейнеры C++
Многие улучшения, сделанные из C в C++ вызывают сомнения и вопросы... Именно поэтому, наверное,...

2
06.07.2019, 15:47
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.07.2019, 15:47
Помогаю со студенческими работами здесь

Ассоциативные контейнеры STL
Везде сказано: set - упорядоченное множество уникальных элементов. (есть куча примеров и уроков)...

Контейнеры Stl, экзамен
Очень прошу помочь на экзамене! Написать программу: в контейнере имеется некоторый набор чисел,...

Начала STL и контейнеры C++
Вот такой вот простенький текст предлагается &quot;Начала STL и контейнеры C++&quot;. Скачать свободно...

STL, контейнеры классы
Ребят, помогите кто чем сможет, а то уже мозг не варит за целый день, в общем, вот задание: Первый...

0
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru