Форум программистов, компьютерный форум CyberForum.ru

самопроизвольный выход программы - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Описать рекурсивную функцию Fact(N) вещественного типа, вычисляющую значение факториала http://www.cyberforum.ru/cpp-beginners/thread805341.html
Описать рекурсивную функцию Fact(N) вещественного типа, вычисляющую значение факториала N! = 1•2•. . .•N (N > 0 — параметр целого типа). С помощью этой функции вычислить факториалы пяти данных чисел.
C++ Вычислить сумму и количество элементов массива X(10) Вычислить сумму и количество элементов массива X(10). При условии 0<=xi<=1 http://www.cyberforum.ru/cpp-beginners/thread805340.html
Простой эксплоит переполнения буфера не работает( C++
Здравствуйте, есть простая программа использующая уязвимость переполнения буфера, по сути должна просто закрываться при выполнении и не выводить ошибок, но этого не происходит. "\xd8\x69\x83\x7c" - адрес call esp определен с помощью OllyDbg и равен 0x7c8369d8, адрес функции ExitProcess также узнал с помощью OllyDbg и он равен 0х7c81cb12. Скажите какие могут причины того что код не выполняется как...
из символьного массива в строковый, конкатенация C++
Помогите, пожалуйста! Нужно создать строковый массив, элементами которого будут являться все двубуквенные комбинации английского алфавита. Чтобы каждый элемент имел индекс, свой порядковый номер. char a={'a','b', 'c', 'd', .. , 'z'}; char* c; int k=0; for(i=0; i<26; i++) { for(j=0; j<26; j++) {
C++ Подскажите, пожалуйста, ошибки в программе, которая переводит арифметические выражения в postfix notation используя Stack http://www.cyberforum.ru/cpp-beginners/thread805284.html
Помогите, пожалуйста, программа, которая переводит арифметические выражения в postfix notation используя Stack. Программа должна: - читать каждую линию отдельно из файла и проводить расчёт значения; - выводить это линию и результат на экран; - использовать шаблон - класс Stack; - читать файл как character arrays или into Strings. Основные проблемы с описанием ввода данных через файл,...
C++ Квадрат наибольшего периметра Вот эту задачу не могу реализовать. Задано множество (n) точек на плоскости, Выбрать из них 4 разные точки, которые являются вершинами квадрата наибольшего периметра.Координаты каждой из точек вводятся с клавиатуры. Добавлено через 12 минут Задача для С++. Добавлено через 39 минут Алгоритм по-моему очевиден: 1)Задается функция определения расстояния между двумя точками, Определяется... подробнее

Показать сообщение отдельно
kravam
быдлокодер
1694 / 881 / 44
Регистрация: 04.06.2008
Сообщений: 5,441
12.03.2013, 19:10

Не по теме:

Цитата Сообщение от el Domaco Посмотреть сообщение
скорей всего, но проект показать не могу, много личных приёмов, которые я хотел бы за собой и оставить
Весь-то и не надо, откровенно говоря на фиг кому он нужен весь-то. Надо уметь отделить тык скыть зёрна от плевел. Вот не мой РАБОЧИЙ файл, который у меня не компилился:

вот я сюда его даже спрячу- настолько он велик и громоздок
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
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
//Тестовый пример №2 рассылки "Что такое "технология COM" и
//как с ней бороться ?" ([url]http://clubpro.spb.ru/cominside/com0016.html[/url])
//
//Реализация модуля сервера
//
//Автор - Михаил Безверхов
//Авторские права © 2000, Михаил Безверхов
//*****************************************************************************
 
#include "stdafx.h"   //служебные объявления
#include "NeoIntr2.h" //объявления интерфейсов
#include <tchar.h>    //используется ради макроса _T("str")
 
#include <basetyps.h>
#include <wtypes.h>
 
 
//******************************************************************************
//Нам хочется - в сугубо демонстрационных целях - пошпионить за аллокатором
//динамической памяти. Действительно ли срабатывает delete this и когда? 
//Для этого господам программистам, к сожалению, придётся поизощрять мозги - нам 
//придется переопределить new/delete на собственную кучу, а после этого мы
//можем делать с ними что хотим. Мне вот хочется, чтобы delete выдавала на
//консоль сообщение - "блок памяти удаляется", которое бы наглядно показывало
//где и когда отрабатывает delete this.
//Нижеследующий код не имеет никакого отношения к нашей рассылке - это только
//реализация того, что изложено выше.
 
 
HANDLE  g_hHeap  = NULL;  //дескриптор собственной кучи памяти
 
//переопределение глобальных new/delete
inline void * operator new(unsigned int stAllocateBlock){
 
  return ::HeapAlloc(g_hHeap,HEAP_ZERO_MEMORY,stAllocateBlock);
}
 
inline void operator delete(void * obj){
 
  ::MessageBox(NULL,_T("удаляется блок памяти"),_T("NeoSrv2 - аллокатор"),MB_OK);
  ::HeapFree(g_hHeap,0,obj);
}
 
 
//******************************************************************************
//реализация объектов сервера. здесь мы допускаем некую стилевую небрежность,
//исключительно из-за примитивности примера и ясности кода- мы сводим объявление
//и реализацию объектов сервера в ОДИН файл, хотя они должны быть разнесены по
//разным файлам исходного текста - ведь не всякий COM-сервер имеет такие 
//примитивные объекты, которые состоят из одной строчки кода? Поскольку у нас
//только один файл .cpp где требуется полное описание класса объекта сервера
//то мы и слили оба файла в один. Это не есть ошибка...
 
 
//******************************************************************************
//объявление статического типа Banzai
class CBanzai: public NeoInterface{
private:
  ULONG     m_dwRefCnt;           //счетчик ссылок
 
public:
  CBanzai(){ m_dwRefCnt = 0;}     //инициализация...
 
public:
  //экспонируемые методы
  STDMETHOD(QueryInterface)(REFIID riid,void ** ppvObject);
  STDMETHOD_(ULONG,AddRef)();
  STDMETHOD_(ULONG,Release)();
 
  STDMETHOD(Show)(HWND hWhere);
  STDMETHOD(Sound)();
 
};
 
 
//******************************************************************************
//объявление статического типа Hello
class CHello: public NeoInterface{
private:
  ULONG     m_dwRefCnt;           //счетчик ссылок
 
public:
  CHello(){ m_dwRefCnt = 0;}      //инициализация...
 
public:
  //экспонируемые методы
  STDMETHOD(QueryInterface)(REFIID riid,void ** ppvObject);
  STDMETHOD_(ULONG,AddRef)();
  STDMETHOD_(ULONG,Release)();
 
  STDMETHOD(Show)(HWND hWhere);
  STDMETHOD(Sound)();
 
};
 
 
//******************************************************************************
//реализация методов статического типа CBanzai
//******************************************************************************
//метод QueryInterface. Назначение метода - выдать указатель на любой 
//интерфейс, реализуемый объектом или NULL в противном случае. Наш объект 
//реализует два интерфейса - IUnknown и NeoInterface
STDMETHODIMP CBanzai::QueryInterface(REFIID riid,void ** ppvObject){
 
  //реализация QueryInterface крайне проста - мы должны разбираться
  //какой IID поступил на вход и преобразовывать указатель this к этому
  //абстрактному типу...
 
  *ppvObject = NULL;
  
  if(::memcmp(&riid,&IID_IUnknown,sizeof(GUID)) == 0) 
    *ppvObject = static_cast<IUnknown *>(this);
 
  else if(::memcmp(&riid,&IID_NeoInterface,sizeof(GUID)) == 0)
    *ppvObject = static_cast<NeoInterface *>(this);
  
  //а больше мы никаких интерфейсов не реализуем. Код возврата E_NOINTERFACE
  //и есть тот код, который сообщает, что запрашиваемого интерфейса нет.
  else return E_NOINTERFACE;
 
  AddRef(); //счётчик нужно продвинуть - ссылка же размножилась
 
  return S_OK;  //нормальное успешное завершение
}
 
//******************************************************************************
//метод AddRef - просто продвигает вперед счётчик ссылок и возвращает его 
//продвинутое значение
STDMETHODIMP_(ULONG) CBanzai::AddRef(){
 
  m_dwRefCnt++;
 
  return m_dwRefCnt;
}
 
//******************************************************************************
//метод Release - просто продвигает назад счётчик ссылок и возвращает его 
//продвинутое значение. Метод НЕ УДАЛЯЕТ объект, поскольку CBanzai у нас -
//статический объект уровня модуля, а не динамически получаемый по операции new.
//поэтому и аппарат подсчета ссылок в данном объекте - фактически не нужен.
//но клиент не знает, как реализован объект внутри сервера и клиент всё равно
//будет соблюдать протокол взаимодействия...
STDMETHODIMP_(ULONG) CBanzai::Release(){
 
  m_dwRefCnt--;
 
  return m_dwRefCnt;
}
 
//******************************************************************************
//метод Show. Показывает сообщение на экране - "БАНЗАЙ". Параметр - дескриптор
//того окна, кому должно принадлежать показываемое методом сообщение
STDMETHODIMP CBanzai::Show(HWND hWhere){
 
::MessageBox(hWhere,_T("БАНЗАЙ!"),_T("Тестовый пример сервера NeoSrv2"),MB_OK); 
 
return S_OK;
}
 
//******************************************************************************
//метод Sound. Издаёт звук. Звук будет отличаться собою от других только в том\
//случае если соответствующая схема звуковых событий в системе настроена
STDMETHODIMP CBanzai::Sound(){
 
::MessageBeep(MB_ICONASTERISK); 
 
return S_OK;
}
 
 
//******************************************************************************
//реализация методов статического типа Hello
//******************************************************************************
//метод QueryInterface. Назначение метода - выдать указатель на любой 
//интерфейс, реализуемый объектом или NULL в противном случае. И этот объект 
//реализует те же два интерфейса - IUnknown и NeoInterface
STDMETHODIMP CHello::QueryInterface(REFIID riid,void ** ppvObject){
 
  //реализация QueryInterface крайне проста - мы должны разбираться
  //какой IID поступил на вход и преобразовывать указатель this к этому
  //абстрактному типу...
 
  *ppvObject = NULL;
  
  if(::memcmp(&riid,&IID_IUnknown,sizeof(GUID)) == 0) 
    *ppvObject = static_cast<IUnknown *>(this);
 
  else if(::memcmp(&riid,&IID_NeoInterface,sizeof(GUID)) == 0)
    *ppvObject = static_cast<NeoInterface *>(this);
  
  //а больше мы никаких интерфейсов не реализуем. Код возврата E_NOINTERFACE
  //и есть тот код, который сообщает, что запрашиваемого интерфейса нет.
  else return E_NOINTERFACE;
 
  AddRef(); //счётчик нужно продвинуть - ссылка же размножилась
 
  return S_OK;  //нормальное успешное завершение
}
 
//******************************************************************************
//метод AddRef - просто продвигает вперед счётчик ссылок и возвращает его 
//продвинутое значение
STDMETHODIMP_(ULONG) CHello::AddRef(){
 
  m_dwRefCnt++;
 
  return m_dwRefCnt;
}
 
 
//******************************************************************************
//метод Release - продвигает назад счётчик ссылок и возвращает его 
//продвинутое значение. По достижении счётчиком ссылок нуля метод удаляет 
//объект из динамической памяти по delete this, поскольку объекты типа CHello
//сервер реализует в динамической памяти.
STDMETHODIMP_(ULONG) CHello::Release(){
 
  ULONG i = --m_dwRefCnt;
 
  if(i == 0) delete this;
 
  return i;
 
  //немного странноватая конструкция, по сравнению с CBanzai::Release
  //дело в том, что i - автоматическая переменная и она размещается в стеке
  //а m_dwRefCnt - переменная, размещаемая в блоке динамической памяти
  //экземпляра объекта. До тех пор, пока счетчик m_dwRefCnt не достиг нуля
  //конструкция return m_dwRefCnt будет работать. Но как только он достигнет
  //нуля и выполнится delete this блок памяти перестанет существовать и 
  //метод выполняющий return m_dwRefCnt обрушится по нарушению защиты памяти
  //именно поэтому, чтобы и в последний раз метод мог вернуть значение
  //счётчика ссылок мы используем автоматическую переменную
  //возможный ещё вариант кода:
  //  
  //  m_dwRefCnt--;
  //  if(m_dwRefCnt == 0){ delete this; return 0;}
  //  else return m_dwRefCnt;
  //
}
 
//******************************************************************************
//метод Show. Показывает сообщение на экране - "ХЕЛЛО". Параметр - дескриптор
//того окна, кому должно принадлежать показываемое методом сообщение
STDMETHODIMP CHello::Show(HWND hWhere){
 
::MessageBox(hWhere,_T("ХЕЛЛО!"),_T("Тестовый пример сервера NeoSrv2"),MB_OK); 
 
return S_OK;
}
 
//******************************************************************************
//метод Sound. Издаёт звук. Звук будет отличаться собою от других только в том\
//случае если соответствующая схема звуковых событий в системе настроена
STDMETHODIMP CHello::Sound(){
 
::MessageBeep(MB_ICONQUESTION); 
 
return S_OK;
}
 
 
//******************************************************************************
//реализация собственно модуля сервера
//******************************************************************************
 
//реализация объекта Banzai в составе сервера
CBanzai oBanzai;
 
 
//стандартная main для DLL. В этом примере она используется - при старте
//DLL мы создаём свою кучу памяти, а при завершении - уничтожаем
BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
                               ){
 
  switch (ul_reason_for_call){
        case DLL_PROCESS_ATTACH:
      g_hHeap = ::HeapCreate(0,0,0);
      if(g_hHeap == NULL) return FALSE; //завершимся аварийно...
        break;
 
        case DLL_THREAD_ATTACH:
        case DLL_THREAD_DETACH:
        break;
 
        case DLL_PROCESS_DETACH:
      ::HeapDestroy(g_hHeap); //а тут уже всё равно - и так завершаемся
              break;
    }
    return TRUE;
}
 
 
//******************************************************************************
//реализация единственной экспортируемой функции DLL - DllGetClassObject
//Это - та самая функция, которая создаёт объекты, идентифицируемые со стороны
//клиента парой CLSID-IID и возвращает клиенту адрес этого объекта. В общем 
//случае для всех статических типов, реализуемых сервером она должна уметь
//опознавать CLSID, проверять, реализует ли данный CLSID запрашиваемый IID
//и создавать ссылку на такой объект "внутри сервера".
STDAPI DllGetClassObject(const GUID& Guid,
                         const GUID& Iid,
                         void ** ppv
                        ){
  //правило хорошего тона - обнулить возвращаемый указатель на тот
  //случай, если вызов закончится неудачно. Тогда клиент не будет введён
  //в заблуждение относительно того, получил ли он что-то осмысленное
    *ppv = NULL;
 
  //реализация создания объекта статического типа Banzai. Поскольку GUID
  //есть просто длинное двоичное число, а нас в данном случае интересует
  //только ответ на вопрос "равно или нет", то для сравнения GUID мы 
  //пользуемся стандартной CRT-функцией сравнения ::memcmp 
  if(::memcmp(&Guid,&CLSID_Banzai,sizeof(GUID)) == 0){
    //это - CLSID_Banzai
 
    //в прошлом примере здесь мы проверяли - а есть ли такой интерфейс в 
    //составе интерфейсов объекта. Нам и здесь его нужно проверять...
    //Но у нас есть QueryInterface этого объекта, которая эту проверку
    //делает. Её и нагрузим, ведь эта ссылка - одна для всех пользователей
    //статического типа CBanzai, т.е. объект в составе сервера - один и 
    //всем запрашивающим клиентам будет возвращаться один и тот же адрес,
    //который УЖЕ существует, независимо от того запрашивает ли его кто
    return oBanzai.QueryInterface(Iid,ppv);
 
                                          }
 
 
  //реализация создания объекта статического типа Hello
  else if(::memcmp(&Guid,&CLSID_Hello,sizeof(GUID)) == 0){
    //это - CLSID_Hello
 
    //а вот в данном случае объект создаётся в динамической памяти по
    //запросу - до запроса он не существует. Его можно создать, а потом
    //так же нагрузить QueryInterface для проверки и приведения типа
    //указателя на интерфейс. НО! Дело выбора программиста - делать так, а
    //потом, если QueryInterface вернет E_NOINTERFACE разрушать объект.
    //Либо не создавать объект, а сначала проверить корректные ли значения
    //IID поступили на вход и уже после этой проверки либо создавать, либо
    //не создавать объект вовсе. С моей точки зрения этот выбор определяется
    //только сложностью самого "поднимаемого" объекта - стоит ли его
    //"беспокоить всуе". Учитывая, что E_NOINTERFACE - ошибка, исключительная
    //ситуация? то оптимизировать стоит "нормальную" ветвь исполнения. Поэтому
    //мы слелаем всё так, как и при выдаче ссылки на CBanzai, с поправкой
    //на то, что делаем объект в динамической памяти.
 
    //а вот место возникновения грозной ошибки, с которой ранее не боролись -
    //что будет, если вызов new провалится?
    CHello * p = new CHello();
 
    if(p == NULL) return E_OUTOFMEMORY; //ну а что еще можно сделать?
 
    HRESULT hr = p->QueryInterface(Iid,ppv);
 
    if(hr == E_NOINTERFACE) delete p;
 
    return hr;
                                                         }
  //а больше никаких CLSID мы не реализуем
  else return CLASS_E_CLASSNOTAVAILABLE;
 
  //вызов был успешен и в ppv - адрес запрашиваемого объекта
}



И вот что от него осталось, когда я упрощал:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
//dllka.cpp
#include <unknwn.h>
void f(){
  
  //Размер взят от балды
  char x [23];
 
  //так ругается
  //if(memcmp(&x,&IID_IUnknown,2)); 
  
  //а так нет
  memcmp(&x,&IID_IUnknown,2); 
}
И ошибка была где-то в этом маленьком кусочке, и парни со мной работали и помогли. А была бы простыня- кто бы стал возиться? Начинай с конца, убирай инструкции блоками, следи за тем, чтобы эффект был тем же- чё тебя учить что ли надо...



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