![]() |
|
Модераторы: bsa |
![]()
|
|
| wallstreet |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 153 Регистрация: 11.8.2011 Репутация: нет Всего: нет |
Спасибо за помощь, теперь все как надо.
Не понимаю почему появляются эти каракули, если при создании области памяти указывается размер буфера
кстати чем функция sizeof() более подходит чем lstrlen(), которая возвращает не кол-во символов в строке, а непосредственно длину без учета '\0'? А еще по возможности прокомментируйте эту строку:
не понимаю как мы к массиву unsigned char прибавляем unsigned long и присваиваем результату '\0'... Фактически замещая иероглифы?!? Пользуясь случаем еще один вопрос хотел бы прояснить для себя. В чем разница между 0 и 0L, если говорим о типе DWORD? Заранее благодарю! Это сообщение отредактировал(а) wallstreet - 13.9.2011, 22:59 |
||||
|
|||||
| Estranged |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 158 Регистрация: 30.8.2010 Репутация: нет Всего: 3 |
Каракули появляются из-за неправильного указания размера буфера. DdeCreateDataHandle требует размер буфера в байтах, lstrlen же в данном случае требует UNICODE строку, коей szDDEServerVersion не является, поэтому надо использовать lstrlenA, но нет смысла это делать, потому что строка szDDEServerVersion не изменяется нигде, отчего можно использовать sizeof, который будет вычислен в процессе компиляции, а не во время работы программы. Конечно, если длина строки заранее неизвестна, то надо использовать lstrlenA (строка) + 1, в данном случае просто совпадение, что длина строки равна ее размеру в байтах, для UNICODE такой финт не проходит, поэтому универсальный способ - умножить размер строки на размер одного символа строки ((lstrlen () + 1) * sizeof (TCHAR)), для UNICODE это будет равносильно умножению на два, а для однобайтовых символов - на 1. Эта строка записывает нуль-терминатор после последнего актуального символа, полученного в функции DdeGetData, эта строка не нужна здесь, если есть учет нуль-терминатора в DdeCreateDataHandle. И не замещает иероглифы, а устанавливает окончание строки. Все строки оканчиваются специальным непечатным символом - нуль-терминатором. Вообще-то, это арифметика указателей, просто найти адрес по смещению dwGetBytes байт от начала szBuf и вписать туда нуль-терминатор. DWORD - double word. Word - 16-битное число. В данном случае, это 32-битное беззнаковое целое число (unsigned long). А посфикс L в числе - это просто указание, что данная константа типа long. Формально в этом проекте разницы нет никакой, т.к. в модели данных (компилятор MSVS C/C++) размеры в байтах типа int и long совпадают, разница есть тогда, когда long больше по размеру, чем int, такое тоже бывает. Это сообщение отредактировал(а) Estranged - 14.9.2011, 01:11 |
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: нет Всего: 106 |
ужос
-------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: нет Всего: 106 |
-------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| wallstreet |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 153 Регистрация: 11.8.2011 Репутация: нет Всего: нет |
Добрый день.
Решил сервер и клиент разбить на два разных приложения и не получается подсоединиться клиентом к серверу, хотя идентификаторы сервиса и топика у них одни и те же. Клиент подвисает на минуту, две и в результате не коннектится. Чувствую, что в какой-то момент нужно приостановить работу сервера и каким-то образом ждать пока клиент не создаст коннект.Только как это сделать не могу понять. Точнее не могу понять на каком этапе и как сервер будет понимать, что к нему пытаются подконнектиться? Обычно это просходит когда колбек сервера возвращает XTYP_CONNECT в котором мы и сравниваем идентификаторы строк сервисов. Но в моем приложении колбек даже не вызывается клиентом. Вобщем опять ай нид хелп.( сервер и клиент прилагаю ниже: сервер клиент Это сообщение отредактировал(а) wallstreet - 22.9.2011, 20:38 |
|||
|
||||
| Estranged |
|
||||||||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 158 Регистрация: 30.8.2010 Репутация: нет Всего: 3 |
Названия сервера не совпадает, топик и айтемом тоже не совпадает. Я бы удивился, если бы соединился клиент.
Уберите приведение типа - все станет понятно:
Можно сделать вот так:
Я уже отвечал по поводу этого: http://forum.vingrad.ru/index.php?showtopi...t&p=2398575 Читать с слов "Второе: (LPCWSTR)"hInst" это такая хитрость обойти ошибку C2664 компилятора?"
Сервер не отвечает, потому что он занят:
Мы заблокировали работу программы. Чтобы сервер нам ответил, мы должны предоставить свободу работы для сервера - не блокировать его: В свойствах проекта сервера сменить тип системы на Windows (configuration properties - linker - system) Выглядит вот так. Вместо main написать вот это, только предварительно разберитесь с приведениями типа к LPCWSTR в части с DdeCreateStringHandle:
Среди минусов - невозможно остановить сервер - это приложение без окон. |
||||||||||
|
|||||||||||
| wallstreet |
|
||||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 153 Регистрация: 11.8.2011 Репутация: нет Всего: нет |
если открываю сервер так:
выдает ошибку невозможности приобразования const wchar_t[7] в LPSTR. Не заню правильно или нет, но открывая сервер вот так:
при этом строки у меня типа LPSTR, насколько я понимаю это кодировка ASCI, которую в дальнейшем конвертирую в LPWSTR
Вроде ошибок компилятор не выдает, но и консоль не грузится. И чувствую что что-то не так. А так, если отклониться от темы, то купил недавно книгу по Win32 ("Технология программирования на с++ win32 API приложений" Н.А.Литвиненко) в надежде хоть чуток приобрести знаний по типам данных винды, ну и вообще. Вобщем облом, развернутой инфы нет, только вскользь на пол страницы про кодировки юникод и аски в отличии от описания различных функций. Вот реально понимаю, что тема важная, надо знать.. Но как въехать в нее, с чего начать? Столько типов разных, как понимать какой из них применять именно в этом случае ну и вообще.. Вот к примеру в моем примере строки необходимо удалять функцией SysFreeString, однако она принимает только строки типа BSTR, а у меня то LPWSTR... уууу я схожу с ума)) Короче мне опять нужна ваша бесценная помощь. Ссылка на проект Это сообщение отредактировал(а) wallstreet - 25.10.2011, 23:03 |
||||||
|
|||||||
| wallstreet |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 153 Регистрация: 11.8.2011 Репутация: нет Всего: нет |
Господа, ларчик просто открывался))))
Это сообщение отредактировал(а) wallstreet - 17.11.2011, 15:31 |
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |