Форум программистов, компьютерный форум, киберфорум
C (Си)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 02.08.2016
Сообщений: 6

Прога на С падает с ошибкой нарушение прав записи

07.05.2017, 00:26. Показов 1278. Ответов 3

Студворк — интернет-сервис помощи студентам
Всем привет!

Я просто в шоке, если честно. Нет, может быть это и нормально, просто я ни разу c таким не сталкивался... Пишу расширение для PHP. Набросал код, который меняет иконку в любом экзешнике, который даже не имеет ресурсов изначально. Пользуйтесь, мне не жалко) Компилится и под С, и под С++.

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
        HANDLE hUpdateRes = BeginUpdateResource ("файл", FALSE);
        
        if (hUpdateRes == NULL) {
 
             zend_error (E_WARNING, "res_set (): error opening module: %s", win32_strerror (buffer, WIN32_STRERROR_BUFFER_LEN));
             RETURN_FALSE;
 
        }
 
        HANDLE icoFile = CreateFile ((_TCHAR *) "иконка", GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
        
        if (icoFile == INVALID_HANDLE_VALUE) {
            
            zend_error (E_WARNING, "res_set (): icon file not found or incorrect: %s", data);
            CloseHandle (icoFile);
            RETURN_FALSE;
 
        }
 
        DWORD read;
        DWORD size = GetFileSize (icoFile, NULL);
        BYTE *temp = (BYTE *) GlobalAlloc (GMEM_FIXED, size);
 
        ReadFile (icoFile, temp, size, &read, NULL);
        
        ICONDIR *ig = (ICONDIR *) temp;
 
        DWORD newSize = sizeof (GRPICONDIR) + (sizeof (GRPICONDIRENTRY)* (ig->idCount - 1));
        GRPICONDIR *newDir = (GRPICONDIR*) GlobalAlloc (GMEM_FIXED, newSize);
        newDir->idReserved = ig->idReserved;
        newDir->idType = ig->idType;
        newDir->idCount = ig->idCount;
 
        DWORD rv, size1;
        BYTE *offset;
        
        for (int i = 0; i < ig->idCount; i++) {
            
            offset = (temp + ig->idEntries[i].dwImageOffset);
            size1 = ig->idEntries[i].dwBytesInRes;
 
            newDir->idEntries[i].bWidth = ig->idEntries[i].bWidth;
            newDir->idEntries[i].bHeight = ig->idEntries[i].bHeight;
            newDir->idEntries[i].bColorCount = ig->idEntries[i].bColorCount;
            newDir->idEntries[i].bReserved = ig->idEntries[i].bReserved;
            newDir->idEntries[i].wPlanes = ig->idEntries[i].wPlanes;
            newDir->idEntries[i].wBitCount = ig->idEntries[i].wBitCount;
            newDir->idEntries[i].dwBytesInRes = ig->idEntries[i].dwBytesInRes;
            newDir->idEntries[i].nID = (i + 1);
            
            if (UpdateResource (hUpdateRes, RT_ICON, MAKEINTRESOURCE (i + 1), lang, (LPVOID) offset, size1) == 0) {
                
                zend_error (E_WARNING, "res_set (): error updating module: %s", win32_strerror (buffer, WIN32_STRERROR_BUFFER_LEN));
                RETURN_FALSE;
 
            }
            
        }
 
        if (UpdateResource (hUpdateRes, RT_GROUP_ICON, name, lang, (LPVOID) newDir, newSize) == 0) {
            
            zend_error (E_WARNING, "res_set (): error updating module: %s", win32_strerror (buffer, WIN32_STRERROR_BUFFER_LEN));
            RETURN_FALSE;
 
        }
 
        EndUpdateResource (hUpdateRes, FALSE);
        CloseHandle (icoFile);
 
        if (newDir != NULL) GlobalFree (newDir);
        if (temp != NULL) GlobalFree (temp);
Если я пользую его как отдельную прогу - все работает прекрасно, однако когда я переношу его в основной проект (по сути копипастом), все падает когда я обращаюсь к нему уже через PHP. Сам PHP никаких ограничений не накладывает, это просто ретранслятор.

Ругается на эту строку:

C
1
    if (UpdateResource (hUpdateRes, RT_ICON, MAKEINTRESOURCE (i + 1), lang, (LPVOID) offset, size1) == 0) {
Ну как ругается, сам он ни на что не ругается, я наставил бряков и пришел к этой строке, потом проверил все переменные. Вылетает конкретно из-за offset и size1. Цикл работает нормально, ибо если закомментить этот кусок - он проходит его как нужно. Все вылетает не только конкретно в этой строке, но и если попытаться вывести значение этих переменных на экран. Так же сама UpdateResource () отрабатывает нормально, если заменить эти две переменные на вообще рандомные, тогда все правильно пихается в ресурсы (разве что данные при этом фейковые, это да). То есть дело по-любому в них. Ну думаю ладно, не проблема, наверное цикл неверно их формирует, может пустые элементы имеются, однако та же переменная newDir, которая используется во второй UpdateResource (), работает нормально (то есть с ней все работает нормально), хотя она точно так же формируется в этом цикле.

В общем реально, как так можно арканиться?

Заранее благодарен!

Добавлено через 6 часов 30 минут
Ну елки! Нарушение прав на чтение же конечно же! А отредактировать уже нельзя. Вот дела(
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.05.2017, 00:26
Ответы с готовыми решениями:

Нарушение прав доступа к записи
#include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;string.h&gt; #include &lt;iomanip&gt; #include &lt;fstream&gt; #include &lt;istream&gt; using...

Нарушение прав доступа при записи
Доброго времени суток всем! Перечитал много тем на форуме и в интернете. Никак не могу решить свою проблему. Мне нужно сравнить символ...

Нарушение прав доступа при записи
Подскажите, пожалуйста, почему при запуске такой программы(она должна в файле подсчитывать количество строк и букв а ) #define...

3
0 / 0 / 0
Регистрация: 02.08.2016
Сообщений: 6
08.05.2017, 17:56  [ТС]
C первой переменной расквитался, нужно было просто привести ее к типу BYTE (то есть вот так):

C++
1
offset = (temp + (BYTE) ig->idEntries[i].dwImageOffset);
Но вторая никак не дается. UpdateResource () принимает DWORD последним аргументом, поэтому пробовал привести ее к DWORD (а от безысходности даже к int), но безрезультатно(

P. S. У всех в темах по десять ответов, хотя вопросы тоже касаются банального приведения типов, а у меня ноль уже какой день... Как-то нездорОво это все... Может под другим акком попробовать запостить, вдруг прокатит, ибо может какие предрассудки тут ко мне имеются, хотя оставил-то 4 сообщения всего))
0
1786 / 1036 / 445
Регистрация: 12.05.2016
Сообщений: 2,550
08.05.2017, 19:29
Цитата Сообщение от Acuna Посмотреть сообщение
Если я пользую его как отдельную прогу - все работает прекрасно
А компилится без варнингов?
0
0 / 0 / 0
Регистрация: 02.08.2016
Сообщений: 6
08.05.2017, 21:29  [ТС]
В отдельной проге? Точно, сейчас гляну...

Добавлено через 20 минут
Нет, все чисто( И привести offset принудительно к BYTE не получится, иконка будет битая. Что ж за непруха-то такая?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
08.05.2017, 21:29
Помогаю со студенческими работами здесь

Нарушение прав доступа при записи
Создаю свой класс ошибок следующим образом: class SecureTransportException { private: SecureLibraryErrorCode errorCode_; ...

Нарушение прав доступа для записи
Здравствуйте форумчане. Вот код: int heath1=100; int heath2=20; char* buf=&quot;100&quot;; char* buf2=&quot;20&quot;; case WM_PAINT: bmpmis1...

Нарушение прав доступа при записи
подскажите почему возникает ошибка void ChangeBrightness(HDC hdc, RECT In, RECT Out, DWORD Mode, double N) { int i; int j; int...

Нарушение прав доступа при записи
Всем привет, нужно было сделать справочник, atoi(a) выделяет как ошибку, ЧЯДНТ? #include &lt;iostream&gt; #include &lt;fstream&gt; ...

Нарушение прав доступа при записи
Привет всем! Извините за тупизм но у меня проблема. #include &lt;iostream&gt; using namespace std; void f(char* str) { int length =...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru