Поиск:

Ответ в темуСоздание новой темы Создание опроса
> C++ Builder разница между проектами, VCL и Console 
:(
    Опции темы
Riply
Дата 23.6.2008, 09:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Комодератор
Сообщений: 572
Регистрация: 27.3.2007
Где: St. Petersburg

Репутация: нет
Всего: 32



Здравствуйте !
Попробовала сделать так:
В Builder выбираем File --> New --> VCL Forms Application.
Выбрасываем из проекта Unit1 и res.
В оставшемся Project1 чуть меняем код на:
Код

#include <sysutils.hpp>
#pragma hdrstop
//---------------------------------------------------------------------------
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
if (IntToStr(9) == "ii") Beep(100, 100);
return 0;
}
Сохраняем и "билдим": все OK.

Теперь пытаемся тоже проделать с консольным проектом:
Выбираем File --> New --> Other --> Console Application
Опять чуть меняем код на:
Код

#include <sysutils.hpp>
#pragma hdrstop
//---------------------------------------------------------------------------
int main(int argc, char* argv[])
{
if (IntToStr(9) == "ii") Beep(100, 100);
return 0;
}
и пытаемся "билдить".
И нам выдаются следующие ошибки:
[Linker Error] Error: Unresolved external 'System::__linkproc__ __fastcall LStrClr(void *)' referenced from C:\PROGRAM FILES\BORLAND\BDS\4.0\LIB\DEBUG\VCLE.LIB|dstring
[Linker Error] Error: Unresolved external '__fastcall Sysutils::IntToStr(int)' referenced from E:\DELETE FILES\CONSOL\DEBUG_BUILD\UNIT1.OBJ
[Linker Error] Error: Unresolved external 'System::__linkproc__ __fastcall LStrFromPChar(System::AnsiString&, char *)' referenced from C:\PROGRAM FILES\BORLAND\BDS\4.0\LIB\DEBUG\VCLE.LIB|dstring
[Linker Error] Error: Unresolved external 'System::__linkproc__ __fastcall LStrCmp()' referenced from C:\PROGRAM FILES\BORLAND\BDS\4.0\LIB\DEBUG\VCLE.LIB|dstring

Объясните мне, пожалуйста, в чем разница
и как консольный проект научить принимать, например, sysutils.hpp без ругани smile

PM MAIL   Вверх
mes
Дата 23.6.2008, 09:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 6
Всего: 250



Цитата(Riply @  23.6.2008,  09:27 Найти цитируемый пост)
Unresolved external 'System::__

означает что есть вызов функции(класса) у которого нет тела. 
В вашем случае надо добавить нужные библиотеки к проекту. 



--------------------
PM MAIL WWW   Вверх
ama_kid
Дата 23.6.2008, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

Репутация: 10
Всего: 95



Цитата(Riply @  23.6.2008,  09:27 Найти цитируемый пост)
как консольный проект научить принимать, например, sysutils.hpp без ругани
Поставить галку Project->Options->Packages->Build with runtime packages = True; 
Цитата(Riply @  23.6.2008,  09:27 Найти цитируемый пост)
Объясните мне, пожалуйста, в чем разница
Разница в том, что эта галка для VCL-приложений стоит автоматом...   smile 



--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
Riply
Дата 23.6.2008, 11:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Комодератор
Сообщений: 572
Регистрация: 27.3.2007
Где: St. Petersburg

Репутация: нет
Всего: 32



Спасибо всем !

Цитата(ama_kid @  23.6.2008,  10:48 Найти цитируемый пост)
Разница в том, что эта галка для VCL-приложений стоит автоматом


А ведь ни за что бы сама не догадалась  smile 

PM MAIL   Вверх
Riply
Дата 24.6.2008, 06:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Комодератор
Сообщений: 572
Регистрация: 27.3.2007
Где: St. Petersburg

Репутация: нет
Всего: 32



Цитата(ama_kid @  23.6.2008,  10:48 Найти цитируемый пост)
Поставить галку Project->Options->Packages->Build with runtime packages = True; 


А как можно аналогичное проделать "вручную" ? Или это довольно сложно ?

P.S.
 На самом деле мне нужен не sysutils.hpp, а system.hpp
 Хочу поробовать "достать" из него MemoryManagerEx и сопутствующие ф-ии.


PM MAIL   Вверх
bsa
Дата 24.6.2008, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: нет
Всего: 196



Riply, может стоит воспользоваться Win32API напрямую?
Кстати, этот MemoryManagerEx упоминается только на этом форуме - больше нигде гугл не нашел. Может это неспроста?  smile 

Это сообщение отредактировал(а) bsa - 24.6.2008, 10:26
PM   Вверх
ama_kid
Дата 24.6.2008, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

Репутация: 10
Всего: 95



Цитата(Riply @  24.6.2008,  06:08 Найти цитируемый пост)
А как можно аналогичное проделать "вручную" ?
Что значит "вручную"? Вроде бы и так ручнее некуда smile
Насчет MemoryManagerEx - соглашусь с bsa, не понимаю, зачем этот геморрой и откуда он взялся smile У меня билдер не знает такую функцию...


--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
Riply
Дата 24.6.2008, 10:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Комодератор
Сообщений: 572
Регистрация: 27.3.2007
Где: St. Petersburg

Репутация: нет
Всего: 32



Цитата(bsa @  24.6.2008,  10:25 Найти цитируемый пост)
Кстати, этот MemoryManagerEx упоминается только на этом форуме - больше нигде гугл не нашел. Может это неспроста?


Может потому что искал именно MemoryManagerEx ?
На запрос TMemoryManagerEx что-то выдает smile Можно еще посмотреть TMemoryManager, но он устарел.

Цитата(bsa @  24.6.2008,  10:25 Найти цитируемый пост)
Riply, может стоит воспользоваться Win32API напрямую?


Не поняла, что имеется ввиду ? 
Я то просто хотела попробовать использовать вкусности от Borland-овского менеджера памяти в Builder`е smile

Добавлено через 3 минуты и 38 секунд
Цитата(ama_kid @  24.6.2008,  10:34 Найти цитируемый пост)
Насчет MemoryManagerEx - соглашусь с bsa, не понимаю, зачем этот геморрой и откуда он взялся


Из Delphi smile


PM MAIL   Вверх
ama_kid
Дата 24.6.2008, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

Репутация: 10
Всего: 95



Цитата(Riply @  24.6.2008,  06:08 Найти цитируемый пост)
 На самом деле мне нужен не sysutils.hpp, а system.hpp
 Хочу поробовать "достать" из него MemoryManagerEx и сопутствующие ф-ии.
Все равно не понимаю, что мешает... Ну вот я накидал код (смысла в нем я правда не вижу, но как пример)...
Код
#include <stdio.h>
#include <conio.h>
#include <system.hpp>
#pragma hdrstop
//---------------------------------------------------------------------------
int main(int argc, char* argv[])
{
 TMemoryManagerEx MemMgr;
 MemMgr.AllocMem = (void* (_fastcall*)(int)) & AllocMem;
 MemMgr.FreeMem = (int (_fastcall *)(void *)) &FreeMemory;

 char *p = (char *)MemMgr.AllocMem(100);
 strcpy(p,"String long enough...");
 printf("%s",p);
 MemMgr.FreeMem(p);
 getch();
 return 0;
}
Вроде работает. Но в чем его вкусность - не вкурил smile



--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
Riply
Дата 24.6.2008, 11:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Комодератор
Сообщений: 572
Регистрация: 27.3.2007
Где: St. Petersburg

Репутация: нет
Всего: 32



Цитата(ama_kid @  24.6.2008,  11:05 Найти цитируемый пост)
Ну вот я накидал код (смысла в нем я правда не вижу, но как пример)...


Спасибо. Попробую.



Цитата(ama_kid @  24.6.2008,  11:05 Найти цитируемый пост)
Вроде работает. Но в чем его вкусность - не вкурил 


А ее (вкусности) в Builder`е может и не быть.
Я ведь в С++, сейчас нахожусь на уровне "обучения ставить точку с запятой перед else",
что мне дается с большим трудом, после Delphi smile

С чего-то же надо было начинать изучать язык. 
Вот я и решила начать с различных способов работы с памятью, ибо без нее (памяти) никуда smile

PM MAIL   Вверх
Riply
Дата 24.6.2008, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Комодератор
Сообщений: 572
Регистрация: 27.3.2007
Где: St. Petersburg

Репутация: нет
Всего: 32



Цитата(ama_kid @  24.6.2008,  11:05 Найти цитируемый пост)
Ну вот я накидал код 


Только, IMHO, надо чуть чуть не так.
Код

int main(int argc, char* argv[])
{
  TMemoryManagerEx MemMgr;
  GetMemoryManager(MemMgr);
  char *p = (char *)MemMgr.AllocMem(100);
  strcpy(p, "String long enough...");
  printf("%s", p);
  MemMgr.FreeMem(p);
  getch();
  return 0;
}


Вроде работает.
Теперь можно попробовать сравнить с "настоящими" GetMem, AllocMem... e.t.c. smile
PM MAIL   Вверх
bsa
Дата 24.6.2008, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: нет
Всего: 196



Riply, кошмар. Зачем такие сложности?
чем тебя malloc/calloc/free или new/delete не устраивают?
Я уж не говорю про такие вкусности C++, как стандартные контейнеры (string, vector, list, set, map и пр.).
Твой код с их использованием можно написать так:
Код
#include <iostream> //нужен для std::cout и std::endl
#include <string> //нужен для std::string

int main()
{
    std::string text = "String long enough...";
    std::cout << text << std::endl;
//    getch(); //а это нестандартное расширение от Borland
    return 0;
}


Это сообщение отредактировал(а) bsa - 24.6.2008, 12:24
PM   Вверх
Riply
Дата 24.6.2008, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Комодератор
Сообщений: 572
Регистрация: 27.3.2007
Где: St. Petersburg

Репутация: нет
Всего: 32



Цитата(bsa @  24.6.2008,  12:23 Найти цитируемый пост)
Riply, кошмар. Зачем такие сложности?
чем тебя malloc/calloc/free или new/delete не устраивают?


Вполне устраивают smile
Но надо же посмотреть и альтернативные варианты (если они конечно есть),
уяснить разницу и понять что с чем едят smile
PM MAIL   Вверх
bsa
Дата 24.6.2008, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: нет
Всего: 196



Riply, вот есть типичная тривиальная задача - выделить память под N элементов типа int. N на этапе компиляции неизвестна.
Как мы делаем в стандартном Си:
Код
int *array = (int*)malloc(sizeof(int)*N);
...
free(array);
Сложно и малопонятно с первого взгляда.
Как мы делаем под C++:
Код
int *array = new int[N];
...
delete []array;
Наглядней, но все равно надо следить за памятью.
Теперь тоже самое, но с использованием вектора:
Код
std::vector<int> array(N);
Просто и понятно, да и память сам за собой подчистит...

Все эти AllocMem'ы и пр. пришли из дельфи, который не имеет ничего подобного (если не ошибаюсь). Ну и зачем спрашивается пытаться заставить себя научиться работать с тем, что как минимум неудобно и небезопасно, а как максимум еще и медленней работает.

Это сообщение отредактировал(а) bsa - 24.6.2008, 13:22
PM   Вверх
Riply
Дата 24.6.2008, 21:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Комодератор
Сообщений: 572
Регистрация: 27.3.2007
Где: St. Petersburg

Репутация: нет
Всего: 32



Цитата(bsa @  24.6.2008,  13:19 Найти цитируемый пост)
а как максимум еще и медленней работает


Одна из причин, почему все это затеяно -  подтверждение или опровержение этой фразы smile

P.S. 
 Пока нет доказательств, будем считать ее спорной smile

Добавлено через 4 минуты и 2 секунды
Цитата(bsa @  24.6.2008,  13:19 Найти цитируемый пост)
что как минимум неудобно и небезопасно


Ну это кому как. Я привыкла убирать за собой и не вижу в этом неудобств.
Да и плюсом считаю возможность чистить тогда, когда мне надо,
а не когда соизволит компилятор smile
PM MAIL   Вверх
bsa
Дата 24.6.2008, 22:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: нет
Всего: 196



Цитата(Riply @ 24.6.2008,  21:50)
Пока нет доказательств, будем считать ее спорной smile
Редко можно встретить женщину-программиста (женщину-программиста вообще сложно встретить) с подобной дотошностью...
Ну что ж, вперед - доказывай или опровергай.

Цитата(Riply @ 24.6.2008,  21:50)
Ну это кому как. Я привыкла убирать за собой и не вижу в этом неудобств.
Да и плюсом считаю возможность чистить тогда, когда мне надо,
а не когда соизволит компилятор smile 
Есть способы форсировать "чистку" (например, reserve(0) у вектора). С другой стороны, у тебя в голове много лишнего места, чтобы хранить информацию о том, что где-то что-то надо освободить?
PM   Вверх
Riply
Дата 24.6.2008, 22:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Комодератор
Сообщений: 572
Регистрация: 27.3.2007
Где: St. Petersburg

Репутация: нет
Всего: 32



Цитата(bsa @  24.6.2008,  22:06 Найти цитируемый пост)
Ну что ж, вперед - доказывай или опровергай.


Попробую. О результатах будет доложено smile

Раз уж пошло такое дело, еще вопрос:
Под VS 2005, вроде, мне удается более-менее контролировать утечки памяти с помощью _Crt функций.
А вот из под Builder`а не получается до них добраться. Они в нем вообще есть ?
Если нет, то как можно контролировать в нем утечки памяти ?

PM MAIL   Вверх
bsa
Дата 24.6.2008, 22:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: нет
Всего: 196



Цитата(Riply @ 24.6.2008,  22:46)
Если нет, то как можно контролировать в нем утечки памяти ?

во, во...
CodeGuard тебе в помощь. Активируешь его, запускаешь прогу, и у тебя вылазиет полный список ошибок работы с памятью.
PM   Вверх
Riply
Дата 25.6.2008, 01:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Комодератор
Сообщений: 572
Регистрация: 27.3.2007
Где: St. Petersburg

Репутация: нет
Всего: 32



Цитата(Riply @  24.6.2008,  22:46 Найти цитируемый пост)
Попробую. О результатах будет доложено 


Какие-то странные результаты. 
Имеем код:
Код

void __fastcall TForm1::SpeedButton1Click(TObject *Sender)
{
  void *pTmp = NULL;
  int i = 0;
  int aCount = 1000000;
  ULONG BytesPerBlock = 1024;
  _LARGE_INTEGER Tm1, Tm2, gFrequency;
  __int64 Elapsed;
    
  if (QueryPerformanceFrequency(&gFrequency))
   {
     QueryPerformanceCounter(&Tm1);
     for (i = 0; i != aCount; ++i)
      {
         pTmp =  malloc(BytesPerBlock);
         free(pTmp);
       }
     QueryPerformanceCounter(&Tm2);
     Elapsed = (((Tm2.QuadPart - Tm1.QuadPart) * 1000000) / gFrequency.QuadPart);
     ShowMessage("malloc/free:  " + IntToStr(Elapsed));

     QueryPerformanceCounter(&Tm1);
     for (i = 0; i != aCount; ++i)
      {
        pTmp =  new char [BytesPerBlock];
        delete [] pTmp;
       }
     QueryPerformanceCounter(&Tm2);
     Elapsed = (((Tm2.QuadPart - Tm1.QuadPart) * 1000000) / gFrequency.QuadPart);
     ShowMessage("new/delete:  " + IntToStr(Elapsed));

     if (IsMemoryManagerSet)
       {
          TMemoryManagerEx MemMgr;
          GetMemoryManager(MemMgr);
          QueryPerformanceCounter(&Tm1);
          for (i = 0; i != aCount; ++i)
    {
      pTmp =  MemMgr.GetMem(BytesPerBlock);
      MemMgr.FreeMem(pTmp);
     }
          QueryPerformanceCounter(&Tm2);
          Elapsed = (((Tm2.QuadPart - Tm1.QuadPart) * 1000000) / gFrequency.QuadPart);
          ShowMessage("MemoryManagerEx:  " + IntToStr(Elapsed));
        }
  };
}


Получаем такие сообщения:
malloc/free:               203854
new/delete:              268167
MemoryManagerEx:  160868

Либо я чего-то не понимаю, либо где-то партачу,
либо Борландовский менеджер опять на коне smile

Добавлено через 1 минуту и 56 секунд
Цитата(Riply @  25.6.2008,  01:01 Найти цитируемый пост)
Имеем код:

Как-то код неправильно отформатировался. Sorry.

PM MAIL   Вверх
bsa
Дата 26.6.2008, 21:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: нет
Всего: 196



видимо его специально оптимизировали.
PM   Вверх
Riply
Дата 2.7.2008, 20:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Комодератор
Сообщений: 572
Регистрация: 27.3.2007
Где: St. Petersburg

Репутация: нет
Всего: 32



Цитата(bsa @  26.6.2008,  21:13 Найти цитируемый пост)
видимо его специально оптимизировали. 


Может кому будет интересно:
Один мой знакомый заинтересовался механизмом работы с памятью и быстродействием.
Вот что он пишет:
"..............
В результате исследований выяснилось, что занимает больше памяти совсем не 
строки, вопреки моим ожиданиям, а некоторые структуры. Переупорядочил поля 
тех структур - получил в одном случае более 10% экономии, другие проверить 
не могу пока, но думаю там сэкономлено больше. Надеюсь дадут ещё время на 
это, есть ещё как и более глубокие идеи оптимизации, так и идеи насчёт 
улучшения средства исследования (которое пока то ли работает то ли не 
работает - об этом ниже).

Детоуринг RtlAllocateHeap/RtlReAllocateHeap/RtlFreeHeap - идея правильная. 
C++овский new  сводится к сишонму malloc, оттуда вызывается HeapAlloc, 
оттуда уже RtlAllocateHeap. Внутри кое-каких майкрософтовских библиотек 
вызываются Heap* функции напрямую, всё равно попадаем туда же. WinAPI 
функции типа CreateWindow вызывают функции вроде LocalAlloc или HeapAlloc, 
всё равно идём в RtlAllocateHeap. Разумеется, не факт что malloc и 
GlobalAlloc будут _всегда_ сводится к RtlAllocateHeap, но похоже что в моём 
случае все существенные объёмы проходят через RtlAllocateHeap.

Detours заинтересовала как она работает. Например, т.к. задача перехвата 
этим путём может быть разной сложности и в общем случае не решаема (функцию 
чисто из ret так не перехватишь), интересно как далеко она ушла в обработке 
сложных ситуаций. Также интересно насколько транзакция detours действительно 
транзакция. И если настолько, насколько я надеюсь, то как оно работает.

Спуск по коллстеку через StackWalk или StackWalk64 - не всегда работает. На 
самом деле перед этой функцией стоит тоже в общем случае не решаемая задача. 
Реально получается интересный факт - с winapi до ехе спускается вседа, но со 
спуском из кода CRT до прикладного кода иногда проблемы. У StackWalk есть 
параметр ContextRecord. Глянь что про него в MSDN пишут. Оказывается, что 
если передать туда эту структуру, то StackWalk в состоянии обработать спуск 
с malloc до new, иначе - нет. Причём, заполнение структуры не влияет. Видимо 
влияет то заполнение, которое делается самой StackWalk в предыущих вызовах. 
Пока что самые существенные объёмы уже успешно обрабатываются, но будет 
время - попытаюсь добиться чтобы всё обрабатывалось.

Анализ - прост как валенок. Начиная с начала профилируемого интервала при 
Alloc запоминаем в hash_map указатель как ключ, размер и стек вызовов в виде 
адресов возврата как значение. при Free удаляем. В конце профилируемого 
интервала для каждого оставшегося в hash_map адреса ищем адрес возврата 
своего кода: получаем файл исходников из адреса возрата, и функцией strstr 
проверяем его на принадлежность своему коду. Из всего этого составляем 
другой hash_map, здесь уже ключ - адрес_возврата_в_свой_код, значение - 
сумма выделенной памяти ( /* интересная тонкость STL: */ std::map<int,int> 
m; m[3] += 2; m[3] += 2; /* чему равно теперь m[3] ? думаешь неизвестно ? а 
вот и нет, оно будет равно 4. */ ). Теперь перекладываем содержимое этого 
мэпа в контейнер, соритрованый по получившемуся там размеру (я взял map), 
дополняем результат файлом и срокой и именем метода из адреса своего кода - 
вот и результат. Конечно, это не будет "максимально полная картина". Но уже 
представления что надо оптимизировать, а что нет - даёт.

Теперь почему это "то ли работает то ли не работает". Разумеется мы должны 
защититься от повторного вхождения в перехваченные функции, кроме того т.к. 
хешмэпы не потокобезопасны, их нужно защитить. Казалось бы - критическая 
секция, а потом флаг уже вошли мы в перехваченую функцию или нет, если уже 
вошли - выходим. Но это приводит к дедлоку, т.к. Sym* и StackWalk выделяют 
что-то в другом потоке. Сейчас работает хитрая система из TLS и крит. 
секций, но я не уверен, что там всё ок.
.........."

PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.1616 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.