Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > RAD XE


Автор: Kirgston 24.9.2010, 08:56
О ужас... чем дальше тем хуже и хуже. Сейчас перекинул мой проект с 2010 на 2011 (RAD Studio XE) и столкнулся просто таки с просто тупой проблемой. У меня в коде есть работа с сокетами или другими ВинАпи ф-циями которые скажем так "морально устарели". Но аналога пока не видел. Тот же inet_addr или же gethostbyname которые принимают исключительно char ... а Эмбаркадеровци сделали перегрузку своих ф-ций, и убрали char с Юникода. То есть раньше я мог сделать что то нечто

Код

MyFunc(char *str);

UnicodeString str = L"Hello World";
MyFunc(str.c_str());


Сейчас же у них все t_str() , w_str() , c _str() возвращают исключительно Юникод. И мне для старых ф-ций приходится тупо создавать еще одну Анси строку. Ладно это еще пол беды. Но глючный Инди 10 уже надоел... я не понимаю как это надо писать его чтобы у меня с 10го раза код работал так как задумано?! о_О 

Код

AContext->Connection->IOHandler->Write(a);


а - __int64

Вот этот кусочек кода компилируется нормально один раз из 100... То есть оно как то криво собирает проект что этот метод вообще не срабатывает... но в тот же момент код абсолютно нормальный... 
Пишу это исключительно потому что уже пол года сижу на студии, и "возрождая" старенькие проекты которые не реально (из-за некоторых спецификаций) перенести на Студию , или же это займет неоправданное время, и собственно вижу как всё стабильно там работает, всё продумано , всё аккуратно и у них полная совместимость со старыми ф-циями. Тут же всё наоборот... косяк на косяке косяком помахивает  smile 

Ребят. Если кто то разобрался как нормально собирать Инди 10 напишите пожалуйста. А то код нормальный. А вот компилируется глухо. 

Автор: Лена 24.9.2010, 09:25
Для перевода проектов в новую RAD будет полезно ознокомиться с этим:
http://www.delphi2009.ru/Unicode_Delphi-RUS.pdf
и видео в списке - Delphi 2010: вопросы миграции:
http://www.embarcadero-events.eu/index_recorded.html

Цитата(Kirgston @  24.9.2010,  08:56 Найти цитируемый пост)
я не понимаю как это надо писать 


У меня все работает.
Очень полезный форум по Indy: https://forums.codegear.com/forum.jspa?forumID=52 (английский)

Автор: Kirgston 24.9.2010, 09:40
Цитата(Лена @  24.9.2010,  09:25 Найти цитируемый пост)
Для перевода проектов в новую RAD будет полезно ознокомиться с этим:http://www.delphi2009.ru/Unicode_Delphi-RUS.pdfи видео в списке - Delphi 2010: вопросы миграции:http://www.embarcadero-events.eu/index_recorded.html

Спасибо конечно. Но с Юникодом я знаком =)  . Я же говорю что у них просто человеческая поддержка старых ф-ций пропала. И чтобы их использовать приходится изворачиваться. 


Цитата(Лена @  24.9.2010,  09:25 Найти цитируемый пост)
У меня все работает.Очень полезный форум по Indy: https://forums.codegear.com/forum.jspa?forumID=52 (английский)



Ммм ну хорошо , приведу чисто кусок кода моего.

клиент:
Код


    while (1)
    {
        //UnicodeString  a = TC->IOHandler->ReadLn();
        int a = TC->IOHandler->ReadInt64();
        if (a == 0) {
            CloseHandle(hDestFile);
            break;
        }
        UnicodeString str =  TC->IOHandler->ReadString(a+1);

        WriteFile(hDestFile, str.c_str(), str.Length(), &Written, NULL);

    }


сервер:

Код

        while (1)
        {
            char *buf=new char[send_len];
            a = File->Read(buf,send_len);
            if (a == 0) {
                AContext->Connection->IOHandler->Write(a);
                delete[] buf;
                break;
            }
            seek+=send_len;
            b = File->Seek(seek,0);

            AContext->Connection->IOHandler->Write(a);
            AContext->Connection->IOHandler->Write(buf);

            delete[] buf;
        }


Чисто из логики и задумки тут всё работает. Так же это было 1 раз на практике. Я скомпилил. Всё было хорошо. И не просто 1 раз запускался хорошо а дальше нет. А просто нормально работал. Дальше я чуток изменил код вне этой ф-ции и всё... перестал работать 
Код

AContext->Connection->IOHandler->Write(a);


А точнее тот который стоит перед AContext->Connection->IOHandler->Write(buf); . Ребутнул ПК. Почистил проект и скомпилил еще раз. Теперь не работает 
Код

AContext->Connection->IOHandler->Write(a);


тот который вложен в if. Никаких намеков на последовательность и т.д. когда оно хочет тогда компилится нормально. Когда не хочет - криво. В Хэлп бесполезно лазить. Он просто никакой и там ничего нету... а то что есть в 80% случаев итак на глаз видно либо когда залазишь в хидер.

Добавлено через 4 минуты и 45 секунд
Цитата(Лена @  24.9.2010,  09:25 Найти цитируемый пост)
Очень полезный форум по Indy: https://forums.codegear.com/forum.jspa?forumID=52 (английский)


Спасибо, пошел обсирать пиндосов т.к. у меня вот сейчас уже и ReadLn адекватно не работает, хотя 2умя строками выше он работает на ура...

Автор: Alca 24.9.2010, 10:03
А че на голых сокетах не судьба писать?

Добавлено @ 10:04
Пока ты будешь копаться в индейцах, то можно 345 раз написать свои враперы

Автор: Platov 24.9.2010, 11:26
Цитата

Пока ты будешь копаться в индейцах, то можно 345 раз написать свои враперы

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

Автор: mrbrooks 24.9.2010, 12:45
Цитата(Kirgston @  24.9.2010,  10:40 Найти цитируемый пост)
Я же говорю что у них просто человеческая поддержка старых ф-ций пропала. 

Каким образом она пропала? smile
или может тебе просто было лень посмотреть в документацию и понять, что есть врапперы на юникоде для вышеперечисленных функций?

Цитата(Alca @  24.9.2010,  11:03 Найти цитируемый пост)
А че на голых сокетах не судьба писать?

Еретик! Сокеты Беркли в Билдере - это уже слишком. Вот если бы ты написал компонент - то другое дело.  smile 

Автор: Alca 24.9.2010, 13:00
Цитата

 Вот если бы ты написал компонент

А какая существенная разница между классом и компонентой?
Вторую можно таскать мышкой?? )))

Добавлено через 3 минуты и 19 секунд
Цитата

Сокеты Беркли в Билдере - это уже слишком.

Цитата

что есть врапперы на юникоде для вышеперечисленных функций?

может и есть такие, хз

Автор: Лена 24.9.2010, 14:13
Цитата(Platov @  24.9.2010,  11:26 Найти цитируемый пост)
Для меня Инди перестали существовать больше года назад


Что-то не так делаю. smile 
Все проекты на Indy успешно и надежно работают. Возникающие у меня вопросы, всегда объясняют как решить на вышеуказанном английском форуме Indy...

Автор: Kirgston 24.9.2010, 14:39
Цитата(Alca @  24.9.2010,  10:03 Найти цитируемый пост)
А че на голых сокетах не судьба писать?


Надо использовать 1 порт. Мне что весь проект на сокеты переводить? Спасибо, лучше тут разберусь =)


Цитата(mrbrooks @  24.9.2010,  12:45 Найти цитируемый пост)
Каким образом она пропала? или может тебе просто было лень посмотреть в документацию и понять, что есть врапперы на юникоде для вышеперечисленных функций?


какие враперы? c_str() , w_str() , t_str() ???


Автор: _Dimon_ 25.9.2010, 07:51
Попробовал RAD XE 2011, вроде все нормально, но твоей проблемы вообще не понимаю. 
Но сам пока не перевожу свой проект в эту среду, так как надо компоненты сторонних разработчиков, но пока нету их для ХЕ. 

Автор: Kirgston 25.9.2010, 20:29
В добавок добавлю... перенес свой проект на 2011... Запустил. Ну вроде всё нормально. Дал людям потестить. Мне сразу кучу багов. Я смотрю а у меня всё нормально. Потом на соседнем ПК (с ХРюшей ; у меня Вин 7 х64 ) смотрю что при OpenDialog1->Execute - программа закрывается мгновенно, при использовании BROWSEINFO & ITEMIDLIST так же закрывается мгновенно. Так же веб браузер перестал открывать странички... просто пишет что страничка не найдена. В коде я не ковырялся. Всего лишь просто откомпилил на новой студии... может у меня кряк кривой конечно... но увы пока плавно опускаюсь обратно на 10тку (сомневаюсь что у меня руки уже настолько кривые... )

Автор: SVN74 25.9.2010, 20:51
Цитата(Kirgston @  24.9.2010,  09:40 Найти цитируемый пост)
UnicodeString str =  TC->IOHandler->ReadString(a+1);

        WriteFile(hDestFile, str.c_str(), str.Length(), &Written, NULL);

1.
Нельзя передавать  файлы  (кроме текстовых) используя String(и),  - потом возможны ошибки в файлах...
Надо применять буферную передачу или Stream(ы)...
2. 
По теме - лучше изначально в проекте использовать стандартные строковые функции языка С++ , а  к UnicodeString приводить только для VCL компонентов, тогда в будущем не будет таких неприятностей.

Автор: Kirgston 25.9.2010, 20:55
Цитата(Kirgston @  25.9.2010,  20:29 Найти цитируемый пост)
В добавок добавлю... перенес свой проект на 2011... Запустил. Ну вроде всё нормально. Дал людям потестить. Мне сразу кучу багов. Я смотрю а у меня всё нормально. Потом на соседнем ПК (с ХРюшей ; у меня Вин 7 х64 ) смотрю что при OpenDialog1->Execute - программа закрывается мгновенно, при использовании BROWSEINFO & ITEMIDLIST так же закрывается мгновенно. Так же веб браузер перестал открывать странички... просто пишет что страничка не найдена. В коде я не ковырялся. Всего лишь просто откомпилил на новой студии... может у меня кряк кривой конечно... но увы пока плавно опускаюсь обратно на 10тку (сомневаюсь что у меня руки уже настолько кривые... )


Очень извиняюсь. Баг реально присутствует но это относится к дополнительному контролу (АльфаСкин). Я его просто выключил и всё стало на свои места.


Цитата(SVN74 @  25.9.2010,  20:51 Найти цитируемый пост)
1.Нельзя передавать  файлы  (кроме текстовых) используя String(и),  - потом возможны ошибки в файлах...Надо применять буферную передачу или Stream(ы)...


Уже сделал на Стримах. Но бага в Инди всё же есть. Дело в том что метод Write() разрешает передавать строки. И метод WriteLn(). Но если передать Юникод строку с помощью Write() то с помощью ReadLn её прочитать нельзя.


Цитата(SVN74 @  25.9.2010,  20:51 Найти цитируемый пост)
По теме - лучше изначально в проекте использовать стандартные строковые функции языка С++ , а  к UnicodeString приводить только для VCL компонентов, тогда в будущем не будет таких неприятностей.

Ну так ЮникодСтринг эт же оболочка над обычными строками о_О

Автор: mrbrooks 27.9.2010, 08:02
Цитата(Alca @  24.9.2010,  14:00 Найти цитируемый пост)
А какая существенная разница между классом и компонентой?
Вторую можно таскать мышкой?? )))

я же с долей иронии камрад.

Цитата(Alca @  24.9.2010,  14:00 Найти цитируемый пост)
может и есть такие, хз 

msdn

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)