Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» FAQ по Borland C++ Builder

Автор: Pigmeich
Дата сообщения: 12.03.2006 14:01
dyr farot, сенкс, помогло. Вторую галку я сам не нашёл.
Ну а про метры - все поняли что имелось в виду, правильно?
Автор: Kadavr
Дата сообщения: 13.03.2006 10:54
Pigmeich
До скольки угодно метров раздувается не кодом, а формочками. Берёшь неиспользуемую форму и кидаешь на неё несколько картинок побольше. Получаешь прирост в несколько десятков мегов...
Автор: bandyn
Дата сообщения: 27.03.2006 15:30
где можно заказать BDS 2006 почтой разумеется крякнутой?
или может кто-нибудь вышлет копию?
а то у нас в городе никогда не найти!
Расходы все оплачу!
Автор: royt
Дата сообщения: 31.03.2006 09:50
Необходимо на BCB 6.0 программно (не в отладчике) получить call stack - список вызовов процедур. Есть ли для этого какие-то готовые исходники (библиотеки)?

Есть самописный набор функций (основанный на _http://win32.mvps.org/misc/stackwalk.html и других исходниках), делающий всё что надо с помощью Debug Help API (dbghelp.dll) - но при условии, что с exe-шником поставляется файл .dbg (в соответствующем формате). Далее, есть тулза map2dbg (от Lucian Wischik, _http://www.wischik.com/lu/programmer/), которая позволяет сформировать этот .dbg-файл по .map-файлу, генерируемому BCB - но только для Borland C++Builder 5. Но BCB6 стал генерировать .map-файлы, которые чем-то отличаются от .map-файлов BCB5, и map2dbg с ними работает некорректно (т.е. какой-то .dbg файл выдается, но call stack по нему не определяется).
Попалось вот такое сообщение "Stackwalk, map2dbg, BCB6 - solved" (от 2003-09-03), но концов не нашел.

Есть некая "Borland Debug Hook Library", это два файла:
bordebug.dll,
bordebug.h
Но она тоже для BCB5, для BCB6 не попадалось. Да и описание к ней довольно скудное, примеров нету - в свое время не смог заставить работать даже с BCB5.

Знаю еще про JCL (Jedi, JVCL), но ихний debug handler выводит call stack с именами процедур (функций) без номеров строк (место вызова в исходнике). В описании сказано, что для runtime packages номеров исходников ждать не стоит в принципе (т.к. Borland не предоставляет информацию о номерах строк даже в отладочных версиях билиотек: "Borland does not provide detailed MAP files for them so you get procedure or method name only"), но про номера строк компилируемого приложения ничего не говорится - т.е., вроде как, можно ждать вывода номеров строк. Цитата: "To get line number information for Borland RTL and VCL/CLX units you have to check Use Debug DCUs checkbox...". Тем не менее, у меня номера строк не выводятся, а выглядит стек вызовов примерно так:

Код: Exception EAccessViolation occured in @TForm1@StartButtonClick$qqrp14System@TObject at 0 in file
Message: Access violation at address 0044C3CE in module 'SomeApplication.exe'. Read of address 00000170
Call stack:
[0044C3CE] Form1.OBJ.@TForm1@StartButtonClick$qqrp14System@TObject
[00620F3F] RTL.LIB|System.@System@@HandleAnyException$qqrv
[0060414A] RTL.LIB|Math.@Math@Ceil$qqrxg
[006574C2] VCL.LIB|Graphics.@Graphics@TCanvas@GetHandle$qqrv
[006CA85A] VCL.LIB|Buttons.@Buttons@_16428
...
[0066E12E] VCL.LIB|Forms.@Forms@TApplication@Run$qqrv
[00401F2B] SomeApplication.OBJ.WinMain
[0061F81D] RTL.LIB|System.@System@@GetMem$qqri
...
[006CD314] VCLE.LIB|dstring.@System@AnsiString@$bdtr$qqrv
[00401BA7] SomeApplication.OBJ.@C4_2
Автор: RUNaum
Дата сообщения: 15.05.2006 07:31
Кто-нибудь знает что не так с проектом, если он с определенного момента начинает линковаться только с включенным CodeGuard?
С выключенным CodeGuard выдает ошибки:
Код: [Linker Error] Unresolved external '_CG_DESC'
[Linker Error] Unresolved external '_CG_THIS'
[Linker Error] Unresolved external '_CG_A_BP'
[Linker Error] Unresolved external '_CG_DA_EPY'
[Linker Error] Unresolved external '_CG_GDA_EGY'
Автор: xitsa
Дата сообщения: 16.05.2006 09:11

Цитата:
Необходимо на BCB 6.0 программно (не в отладчике) получить call stack - список вызовов процедур. Есть ли для этого какие-то готовые исходники (библиотеки)?

Попробуй madCollection, там есть madStackTrace — по–моему, то что тебе нужно+madExcept
Автор: royt
Дата сообщения: 17.05.2006 14:09

Цитата:
Попробуй madCollection, там есть madStackTrace
да, спасибо. Правда за прошедшее время сам уже вышел на эту библиотеку. Но опять же, сорцы все на паскале.

Также набрел еще на Exceptional Magic. Тоже сорцы все на паскале. Однако именно на этой Exceptional Magic пока и остановился - потому как довольно просто оказалось достучаться до функций библиотеки, позволяющих самому сформировать отчет о call stack. (в EurekaLog это сделать не там просто).

С madCollection пока особо не разбирался. Но, если правильно понял, основные функции реализованы в поставляемой с библиотекой .dll-ке - это уже минус, иногда неудобно. Зато похоже реализация покачественнее, чем у Exceptional Magic (если коротко - в последней производится анализ стека и делаются "предположения" насчет адреса/источника вызова, благодаря чему можно определить вызовы функций без stack frame, но при этом часто библиотека и ошибается, показывая "лишние" вызовы; возможно этот "анализ" можно отключить, но пока это не выяснял)

В общем будем рыть, но похоже проще будет перейти на BDS2006, кажись там теперь есть штатные средства для обсуждаемой задачи.
Автор: spike
Дата сообщения: 18.05.2006 15:10
какой нужен код символа для edit в password, чтобы были кружки, как в XP ?
Автор: OdesitVadim
Дата сообщения: 18.05.2006 15:33
spike
А это кажеться специальный контролл. Для него символы не просматриваются в помощью утилит типа OpenPass
Автор: ShIvADeSt
Дата сообщения: 19.05.2006 00:56
OdesitVadim

Цитата:
А это кажеться специальный контролл. Для него символы не просматриваются в помощью утилит типа OpenPass

Нет это обычный контрол и обычный символ (где то видел его скан код), как вариант запусти The Bat под ХР и увидишь там такие кружки, но пароль вытаскивается на ура. Вот только какой код не помню, там вроде надо шрифт какой то выбирать.
Автор: OdesitVadim
Дата сообщения: 19.05.2006 11:13
ShIvADeSt
В The Bat там действительно компонент, а вот если в системном виндовсовском приложении, то это совсем другое дело.

Цитата:
Вот только какой код не помню, там вроде надо шрифт какой то выбирать.

Можно просто в качестве пасссимвола кода вписать #149. А если ещё курьер шрифт применить полужирный, то вообще лепота
Автор: kot3
Дата сообщения: 23.05.2006 09:04
royt


Цитата:
В общем будем рыть, но похоже проще будет перейти на BDS2006, кажись там теперь есть штатные средства для обсуждаемой задачи.


А можно про эти средства в BDS поподробнее???
Мне тоже интересно получить стек вызовов.
Автор: Razgildai
Дата сообщения: 25.05.2006 14:01
Пытаюсь получить веб страницу через TClientSocket, но что-то не работает?
Смотрю снифером, соед. вроде устанваливается, а вот запрос GET....не проходит, ума не приложу что за дела, может что не так делаю?
Листинг - [more]
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
WebConn->Host = "ya.ru";
WebConn->Port = 80;
WebConn->Open();
Button1->Enabled = False;
Button2->Enabled = True;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::WebConnConnect(TObject *Sender,
TCustomWinSocket *Socket)
{
Memo1->Lines->Add("Connection Established");
}
//---------------------------------------------------------------------------

void __fastcall TForm1::WebConnDisconnect(TObject *Sender,
TCustomWinSocket *Socket)
{
Memo1->Lines->Add("Connection Closed");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
WebConn->Close();
Button1->Enabled=True;
Button2->Enabled=False;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::WebConnError(TObject *Sender,
TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode)
{
Memo1->Lines->Add("Connection Error"+IntToStr(ErrorCode));
return;

}
//---------------------------------------------------------------------------
void __fastcall TForm1::WebConnWrite(TObject *Sender,
TCustomWinSocket *Socket)
{
Socket->SendText("GET http://www.ya.ru/ HTTP/1.1\nAccept: */*\nUser-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en)\nHost: www.ya.ru\nConnection: Keep-Alive\n");
Memo2->Lines->Add("Request Sended....");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::WebbConnRead(TObject *Sender,
TCustomWinSocket *Socket)
{
Memo2->Lines->Add(Socket->ReceiveText());
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
Form1->Close();
}
//---------------------------------------------------------------------------
[/more]
Автор: royt
Дата сообщения: 25.05.2006 15:49

Цитата:
А можно про эти средства в BDS поподробнее??? Мне тоже интересно получить стек вызовов.
Подронобстей пока не знаю. Только читал где-то, что в штатной библиотеке есть средства отобразить call stack например при access violation, давно бы так... Наверняка эти функции доступны через API (borland/VCL-евский).
Автор: kot3
Дата сообщения: 26.05.2006 08:21
royt

Пытался найти - ничего не получилось - у BDS2006 help ну просто ужасный....
Автор: Razgildai
Дата сообщения: 26.05.2006 10:28
Все заработало.
Ошибка:

Код: Socket->SendText("GET http://www.ya.ru/ HTTP/1.1\nAccept: */*\nUser-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en)\nHost: www.ya.ru\nConnection: Keep-Alive\n");
Memo2->Lines->Add("Request Sended....")
Автор: JohnC
Дата сообщения: 26.05.2006 20:28

Цитата:
Теперь вопрос, как остановить прием при получении нужной строки, чтобы лишку не грузить

я делал примерно так, когда баловался флудом.
Сокет в блокирующем режиме.

Код:
void __fastcall Thread::ClientSocketConnect(TObject *Sender,TCustomWinSocket *Socket)
{
int totalread = 0, curread = 0;
int tempTimeOUT = TimeOUT;
AnsiString treadtext = "";

TWinSocketStream* wnscktstrmMain = new TWinSocketStream(Socket,tempTimeOUT) ;
char* point=new char[tmaxRead];
try {
if(wnscktstrmMain->Write(tsendtext.c_str(),tsendtext.Length()) >=tsendtext.Length())
;//Form1->StatusBar1->Panels->Items[0]->Text ="Request Sent";
else {
Form1->LogMemo->Lines->Add(IntToStr(ThrId)+" поток: Error Write");
}
do{
if(wnscktstrmMain->WaitForData(tempTimeOUT)==0)
{
Form1->LogMemo->Lines->Add(IntToStr(ThrId)+" поток: Данные не получены в теченее "+FloatToStr(tempTimeOUT/1000) +" сек.");
break;
}
curread = wnscktstrmMain->Read(point,tmaxRead);
totalread = totalread + curread;
treadtext = treadtext + AnsiString(point,curread);
if(AnsiContainsStr(treadtext, "</html>"))//ТУТ смотрим нужные данные, если есть
break;                //то выходим из цикла и рассоединяемся.
}
while ((ClientSocket->Active)&&(curread<tmaxRead)&&(curread!=0));
}
catch (...)
{
Form1->LogMemo->Lines->Add(IntToStr(ThrId)+" поток: Ошибка "+ProxyHost+":"+ProxyPort);
}
ClientSocket->Socket->Close();
delete wnscktstrmMain;
delete []point;
Автор: Razgildai
Дата сообщения: 30.05.2006 16:53
Появился еще один вопрос.
Событие OnConnect происходит при каждом коннекте или нет?

Ситуация такая:
По нажатию кнопки делаю ClientSocket1->Open();
По событию OnConnect() посылаю запрос
OnConnect()
{
....
Socket->SendText("GET...");
}
По событию OnRead() пишу данные в мемо.
По событию OnDisconnect я вызываю функцию Func();

Func(void)
{
ClientSocket1->Close;
........
//и тут снова отрываю сокет
ClientSocket1->Open();
}
однако событие OnConnect не происходит хоть ты тресни.
Как бы это правильно реализовать?
Автор: JohnC
Дата сообщения: 30.05.2006 20:10
Razgildai
C сокетом в не блокирующем режиме нормально никак не реализовать,
разве что как нибуть извратом, например через таймер.
Используй блокирующий сокет,
в нем функция ClientSocket->Open() возвращает управление после
выполнения события OnConnect или ошибки.
Автор: Kott
Дата сообщения: 31.05.2006 04:37
Razgildai
А счем связана необходимость ТАКОЙ работы с сокетом? Я имею ввиду отсылку строки в собитии OnConnect()?
Автор: Razgildai
Дата сообщения: 31.05.2006 08:05
Kott
пока особо ни с чем, просто решил заняться самообразованием, вот пытаюсь всякие программы писать на работе от нечего делать.
JohnC
попробую. Судя по всему ты прав. Может скинешь на e-mail примерчик shpiblr[sobaka]yahoo[dot]com
Автор: JohnC
Дата сообщения: 03.06.2006 19:48
Razgildai

Цитата:
JohnC
попробую. Судя по всему ты прав. Может скинешь на e-mail примерчик

ок. смотри пм
Автор: Xomyak
Дата сообщения: 05.06.2006 00:51
Я тут пытаюсь сделать что-то вроде ФТП-клиента. Попался на самом простом. Нужно, чтобы при нажатии на выделенную строку ListBox'а и потом на кнопку Download начиналась загрузка файла. Вот кусок:

Код: void __fastcall TFormMain::Button6Click(TObject *Sender)
{
NMFTP1->Download(ListBox1->Selected->Items);
}
Автор: EZH
Дата сообщения: 05.06.2006 09:12
Xomyak
Items - это коллекция выделеных элементов, а ты выдимио пытаешься использовать её как один элемент.
Автор: Razgildai
Дата сообщения: 05.06.2006 11:53
JohnC

Цитата:
ок. смотри пм

спасибо.
Я вот подумал может не использроват этот глюченый TClientSocket а прейти на более низкий уровень, что-то типа

Код:
WSAStartup(0x0101, &wsadata);
s = socket(AF_INET, SOCK_STREAM, 0);
memset((char*)&clnt_sin, ' ', sizeof(clnt_sin));
clnt_sin.sin_family = AF_INET;
clnt_sin.sin_addr.s_addr = INADDR_ANY;
clnt_sin.sin_port = 1235;
erb = bind(s, (struct sockaddr*)&clnt_sin, sizeof(clnt_sin));
memset((char*)&srv_sin, ' ', sizeof(srv_sin));
hp = gethostbyname("name");// имя хоста.
srv_sin.sin_family = AF_INET;
srv_sin.sin_port = 1234;
memcpy((char*)&srv_sin.sin_addr, hp->h_addr, hp->h_length);
erc = connect(s, (struct sockaddr*)&srv_sin, sizeof(srv_sin));
er = WSAGetLastError();
Автор: spike
Дата сообщения: 05.06.2006 12:01
как сделать, чтобы форму нельзя было уменьшить менее определенного размера ?
Автор: EVD
Дата сообщения: 05.06.2006 12:12
spike
У формы есть свойство Constraints
Автор: JohnC
Дата сообщения: 05.06.2006 14:52
Razgildai

Цитата:
Я вот подумал может не использроват этот глюченый TClientSocket а прейти на более низкий уровень

Думаю, использование более низкого уровня даст больше контроля над происходящим процессом, но ценой усложнения кода.
У меня было желание использовать еще более низкий уровень - сырые (raw) сокеты. тогда открываются возможности для замены заголовков пакетов, в том числе и замены ip отправителя.
Автор: Razgildai
Дата сообщения: 05.06.2006 16:18
интересно...
надо будет посмотреть.
Но сначала надо побороть свой вариант, а потом уже переходить на raw socket.
Будем сражаться
Автор: royt
Дата сообщения: 06.06.2006 08:07

Цитата:
Пытался найти - ничего не получилось - у BDS2006 help ну просто ужасный....
к сожалению сам пока не работаю с ним, если что-то узнаю постараюсь здесь отписаться.

ps ...зря наверное тут обсуждение ведем, FAQ все-таки, надо отдельный топик создать. Потом отпишусь в отдельной теме, когда вопрос провентилирую.

Страницы: 12345678910111213141516171819202122232425262728

Предыдущая тема: ms exchange


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.