Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
mkostoevr
Незнайка
25 / 10 / 1
Регистрация: 14.10.2016
Сообщений: 370
Записей в блоге: 2
#1

Опять исключения. Только теперь их вызывает PlaySound - C++

18.04.2017, 01:34. Просмотров 188. Ответов 9
Метки нет (Все метки)

День всем добрый!

Только захотел разукрасить свою программу, как наткнулся на очередную ошибку в виде исключения.

Дело такое. Я воспроизвожу звук при помощи
C++
1
PlaySound(L"C:\\Windows\\MS\\Screenshooter\\OK.wav", NULL, SND_FILENAME | SND_ASYNC);
Первый раз звук воспроизводится, и всё нормально. Но во второй вылетает ошибка: "Вызвано исключение по адресу... Что-то с правами доступа...". Что не так? Дело в том, что я вызываю эту функцию несколько раз не освобождая память? Тогда как её от этой музыки освободить? Или проблема в чём-то другом?

Вот полный код (не знаю, что именно вам понадобится, выложу весь. Самое интересное, связанное со звуком - в самом в конце.):
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
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
/************************************************************
* Based on "A very basic Key logger in C++" by Manish
* Him home: [url]http://technoslab.blogspot.com/search/label/projects[/url]
************************************************************/
 
// Include header files
#define _CRT_SECURE_NO_WARNINGS
 
#include <windows.h>
#include <fstream>
#include <stdio.h>
#include <ctime>
#include <conio.h>
 
#include <gdiplus.h>
 
#pragma comment(lib, "GdiPlus.lib") // Image
#pragma comment(lib,"Winmm.lib")    // Sound
 
using namespace std;
using namespace Gdiplus;
 
const int hs = 0;
 
static const GUID png =
{ 0x557cf406, 0x1a04, 0x11d3,{ 0x9a, 0x73, 0x00, 0x00, 0xf8, 0x1e, 0xf3, 0x2e } };
 
wchar_t wchar_path[32768];
 
char* globBufer;
 
void DoScreenShot(void* pParams);
void Load(void* pParams);
 
// Initialize a keyboard HHOOK
HHOOK KeyboardHook;
 
// Function to write to a file
void write(const char* c)
{
    const char* fileLocation = "F:\\log.txt"; // Define the location of log file
    FILE *f = fopen(fileLocation, "a+"); // Open the log file in append mode
    if (f != NULL)
    {
        fputs(c, f); // Write to end of the file
        fclose(f); // Close the file
    }
}
 
// The WIN API Message Loop
void KeepAlive()
{
    MSG message;
    while (GetMessage(&message, NULL, 0, 0))
    {
        TranslateMessage(&message);
        DispatchMessage(&message);
    }
}
 
// Unhook and exit
void Exit()
{
    UnhookWindowsHookEx(KeyboardHook);
    exit(0);
}
 
// Is shift key down ?
bool shift = false;
// Store window
HWND oldWindow = NULL;
// Window text
char cWindow[MAX_PATH];
 
// Callback function to be hooked
LRESULT CALLBACK keyboardHookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    Load(NULL);
    bool bControlKeyDown = 0;
    // Get current state of capsLock
    bool caps = GetKeyState(VK_CAPITAL) < 0;
    KBDLLHOOKSTRUCT *p = (KBDLLHOOKSTRUCT *)lParam;
    if (nCode == HC_ACTION)
    {
        // Determine the current state of shift key
        if (p->vkCode == VK_LSHIFT || p->vkCode == VK_RSHIFT)
        {
            if (wParam == WM_KEYDOWN)
            {
                shift = true;
            }
            else
            {
                shift = false;
            }
        }
        // Check if F12 + CTRL is pressed, if yes -> exit
        bControlKeyDown = GetAsyncKeyState(VK_CONTROL) >> ((sizeof(SHORT) * 8) - 1);
        if (p->vkCode == VK_SNAPSHOT /*&& bControlKeyDown*/) // If F12 and CTRL are pressed
        {
            DoScreenShot(NULL);
        }
        if (p->vkCode == VK_SNAPSHOT && VK_LMENU && bControlKeyDown) // If F12 and CTRL are pressed
        {
            Exit();
        }
        // Start logging keys
        if (wParam == WM_SYSKEYDOWN || wParam == WM_KEYDOWN) // If key has been pressed
        {
            HWND newWindow = GetForegroundWindow();
            if (oldWindow == NULL || newWindow != oldWindow)
            {
                // Get Active window title and store it
                GetWindowTextA(GetForegroundWindow(), cWindow, sizeof(cWindow));
                write("\nActive Window: ");
                write(cWindow);
                write("\n");
                oldWindow = newWindow;
            }
        }
    }
    // Forward the event to other hooks
    return CallNextHookEx(NULL, nCode, wParam, lParam);
}
 
// WinAPI main method
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
    // Write to file
    write("\n---------------------------------------------------------");
    // Hook to all available threads
    KeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, keyboardHookProc, hInstance, NULL);
    if (KeyboardHook != NULL)
    {
        // Keep alive till F12 + CTRL key press is detected - can also register Hotkey
        KeepAlive();
    }
    // Exit the program
    return 0;
}
 
void Load(void* pParams)
{
    char buffer[32768];
    wchar_t wc_buffer[32768];
    time_t seconds = time(NULL);
    tm* timeinfo = localtime(&seconds);
    char* format = "%d %B %Y, %I.%M.%S.png";
    strftime(buffer, 80, format, timeinfo);
 
    MultiByteToWideChar(1251, 0, buffer, -1, wc_buffer, 1000);
 
    // Открываю файл, в котором хранится каталог для сохранения скриншотов
    HANDLE nxhFile;
    if (INVALID_HANDLE_VALUE != (nxhFile = CreateFile(L"C:\\Windows\\MS\\Screenshooter\\path",
                                                      GENERIC_READ, FILE_SHARE_READ, NULL,
                                                      OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL)))
    {
        DWORD dwBytes = 0, nxBufSize = 0;
        nxBufSize = GetFileSize(nxhFile, NULL);
        char* nxBuffer = new char[nxBufSize / sizeof(char)];
        ReadFile(nxhFile, nxBuffer, nxBufSize, &dwBytes, NULL);
        nxBuffer[nxBufSize / sizeof(char)] = '\0';
        CloseHandle(nxhFile);
 
        globBufer = nxBuffer;
 
        MultiByteToWideChar(1251, 0, nxBuffer, -1, wchar_path, 1000);
 
        wcscat(wchar_path, wc_buffer);
    }
 
    // Если файла нет - создаю его и записываю туда "С:"
    if (!globBufer)
    {
        HANDLE snhFile;
        if (INVALID_HANDLE_VALUE != (snhFile = CreateFile(L"C:\\Windows\\MS\\Screenshooter\\path",
                                                          GENERIC_WRITE, FILE_SHARE_WRITE, NULL,
                                                          CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL)))
        {
            DWORD sndwBytes = 0;
            char* nBuffer_s = "Путь, этот чёртов визуализатор закрашивает всё в красный цвет";
 
            WriteFile(snhFile, nBuffer_s, strlen(nBuffer_s), &sndwBytes, NULL);
            CloseHandle(snhFile);
 
            MultiByteToWideChar(1251, 0, nBuffer_s, -1, wchar_path, 1000);
 
            wcscat(wchar_path, wc_buffer);
        }
    }
}
 
void DoScreenShot(void* pParams)
{
    GdiplusStartupInput gdiplusStartupInput;
    ULONG_PTR gdiplusToken;
    GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
 
    HDC scrdc, memdc;
    HBITMAP membit;
 
    // Получаем HDC рабочего стола
    // Параметр HWND для рабочего стола всегда равен нулю.
    scrdc = GetDC(0);
 
    // Определяем разрешение экрана
    int Height, Width;
    Height = GetSystemMetrics(SM_CYSCREEN);
    Width = GetSystemMetrics(SM_CXSCREEN);
 
    // Создаем новый DC, идентичный десктоповскому и битмап размером с экран.
    memdc = CreateCompatibleDC(scrdc);
    membit = CreateCompatibleBitmap(scrdc, Width, Height);
    SelectObject(memdc, membit);
 
    // Улыбаемся... Снято!
    BitBlt(memdc, 0, 0, Width, Height, scrdc, 0, 0, SRCCOPY);
    HBITMAP hBitmap;
    hBitmap = (HBITMAP)SelectObject(memdc, membit);
    Gdiplus::Bitmap bitmap(hBitmap, NULL);
    bitmap.Save(wchar_path, &png);
 
    DeleteObject(hBitmap);
 
    PlaySound(L"C:\\Windows\\MS\\Screenshooter\\OK.wav", NULL, SND_FILENAME | SND_ASYNC);
}
Программа ловит нажатие на клавишу PrintScreen и делает скриншот.

Заранее, спасибо за помощь!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.04.2017, 01:34
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Опять исключения. Только теперь их вызывает PlaySound (C++):

Скажите пожалуйста как сделать теперь что бы треугольник который справа зарисовваный, оказался только слева зарисованным - C++
Скажите пожалуйста как сделать теперь что бы треугольник который справа зарисовваный, оказался только слева зарисованным!) #include...

«Прибавьте к задуманному числу 5. Теперь из результата вычтите 2. А теперь к результату прибавьте 7» - C++
Клоун предложил каждому из публики задумать число. Потом он сказал: «Прибавьте к задуманному числу 5. Теперь из результата вычтите 2. А...

помогите доделать до конца в делфи. Задание:дан текст определить сколько в нем предложений,теперь мне осталось сделать только исключения - Delphi
var Form1: TForm1; a:string; k,i:integer; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender:...

Таймер вызывает событие только один раз - C#
Доброго времени суток. Будтъте добры подскажите, затупил. Есть такой класс. Я его конструирую, потом вызываю BeginStart. В результате...

Теперь только максимальное число не могу вывести - Delphi
Нужно определить максимальную, минимальную и среднюю арифметическую температуры с помощью массивов, используя StringGrid, а замер...

И опять работа только с видимыми ячейками - VBA
Доброго времени суток всем) Хочу после применения автофильтра занести в массив только видимые ячейки otfil = Range(Cells(10, 1),...

9
nmcf
6207 / 5518 / 1932
Регистрация: 14.04.2014
Сообщений: 23,160
18.04.2017, 09:24 #2
А без этой функции программа нормально работает?
0
mkostoevr
Незнайка
25 / 10 / 1
Регистрация: 14.10.2016
Сообщений: 370
Записей в блоге: 2
18.04.2017, 10:18  [ТС] #3
nmcf, да, нормально. Проблема возникает при попытке воспроизвести звук.
0
MrGluck
Модератор
Эксперт CЭксперт С++
7801 / 4845 / 754
Регистрация: 29.11.2010
Сообщений: 13,212
18.04.2017, 11:38 #4
А без флага SND_ASYNC пробовали?
В дебагере по шагам ходили? Вылетает именно на строчке с PlaySound?
0
mkostoevr
Незнайка
25 / 10 / 1
Регистрация: 14.10.2016
Сообщений: 370
Записей в блоге: 2
18.04.2017, 12:40  [ТС] #5
MrGluck, пробовал. Вылетает как раз при многократном выполнении этой функции.

1, иногда 2 раза подряд если её вызвать, она работает, но если вызвать её третий раз уже вылетает исключение.
0
MrGluck
Модератор
Эксперт CЭксперт С++
7801 / 4845 / 754
Регистрация: 29.11.2010
Сообщений: 13,212
18.04.2017, 13:03 #6
mkostoevr, а это пробовали перед повторным вызовом?
To terminate an asynchronously played waveform sound, call PlaySound with pszSound set to NULL.
0
mkostoevr
Незнайка
25 / 10 / 1
Регистрация: 14.10.2016
Сообщений: 370
Записей в блоге: 2
18.04.2017, 13:13  [ТС] #7
MrGluck, попробовал, та же проблема.

Добавлено через 3 минуты
MrGluck, пришлось костыльнуть. Сделал отдельную программу, которая нормально звук воспроизводит и когда надо запускаю её.

Но как-то это не по-программерски...
0
MrGluck
Модератор
Эксперт CЭксперт С++
7801 / 4845 / 754
Регистрация: 29.11.2010
Сообщений: 13,212
18.04.2017, 13:15 #8
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Надо смотреть что конкретно вызывало exception, какие параметры при этом передавались, что в памяти вообще лежит и т.д.
Можно прибегнуть к помощи WinDbg.
1
mkostoevr
Незнайка
25 / 10 / 1
Регистрация: 14.10.2016
Сообщений: 370
Записей в блоге: 2
18.04.2017, 13:40  [ТС] #9
MrGluck, ладно, постараюсь позже вникнуть в тему, а пока костыль буду использовать, программа всё равно для личного пользования.
0
MrGluck
Модератор
Эксперт CЭксперт С++
7801 / 4845 / 754
Регистрация: 29.11.2010
Сообщений: 13,212
18.04.2017, 14:35 #10
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
mkostoevr, ну раз уж костыль, можно хотя бы ShellExecute прикрутить
1
18.04.2017, 14:35
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.04.2017, 14:35
Привет! Вот еще темы с ответами:

Правда ли, что в оператор delete только вызывает деструктор, но не разрушает объект - C++/CLI
Всем привет. Скажите, пожалуйста правда ли что в С++/CLI оператор delete только вызывает деструктор (к примеру для ссылочного класса) но не...

windows активировала, теперь только черный экран и курсор - Windows 7
вначале появился черный экран с окном активации, ни значков пуск ни других каких либо. после активации и перезагрузки никакое окно не...

Форма вызывает другую. Вернуть управление первой только после заполнения всех полей на второй - C#
есть 2 формы. на 1ой есть кнопка &quot;Добавить предмет&quot;. По нажатию на эту кнопку открывается 2я форма на которой присутствуют текстовые поля...

В адресной строке explorer'а вместо пути теперь показывается только название папки. - Windows XP
Поиск не юзал. Простите грешного.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru