Конкатенация строк (сишникам)

Вопросы по языкам программирования Си и С++.
SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Конкатенация строк (сишникам)

Сообщение SLIM » 04.07.2010 (Вс) 15:32

Зачастил я с вопросами по сям на форуме с VB, но все же.

Есть значит COM-строки BSTR типа - указатель на WCHAR массив (у такой строки есть еще кое-что, но не так важно).

Для того чтобы указатель указывал на реально занятый кусок памяти, есть системная функция SysAllocString.
Проблема дальше.

Нужно объединять строку BSTR с какой-нибудь другой, но вот в стандартной библиотеке я такую функцию не нашел.
В принципе, указатель указывает на начало строки, поэтому можно попытаться объединить с помощью strcat, или ее другом для Unicode wcscat, тем самым функция добавит в конец нужную строку. Только вот BSTR строка имеет также и маленький апендикс спереди, где учитывается количество символов в строку. По видимому функция SysStringLen берет данные именно оттуда. И если присоединить строку с помощью wcscat, то значение счетчика количества символов не переобределится. И, к примеру, SysFreeString осовбодит, возможно, не весь участок памяти.
Поэтому после объединения, я "перезанимал" занятую память с помощью SysReAllocString, так
Код: Выделить всё
SysReAllocString(&MyString, MyString);


И все вроде бы работает. Но вот проблема вышла.
Есть два участка кода.
1.
Код: Выделить всё
bstrSQLQuery = SysAllocString(L"declare @sql_handle varbinary(64) select @sql_handle = sql_handle from master.dbo.sysprocesses where spid=");
            wcscat(bstrSQLQuery, lpPID);
            wcscat(bstrSQLQuery, L"select * from ::fn_get_sql(@sql_handle) sql");
            SysReAllocString(&bstrSQLQuery, bstrSQLQuery);

2.
Код: Выделить всё
bstrSQLQuery = SysAllocString(L"CREATE TABLE #ssproject ([ET] [nvarchar] (30), [Par] [int], [EI] [nvarchar] (255)) insert into #ssproject exec sp_executesql N'DBCC INPUTBUFFER (");
            wcscat(bstrSQLQuery, lpPID);
            wcscat(bstrSQLQuery, L")'");
            SysReAllocString(&bstrSQLQuery, bstrSQLQuery);


Второй работает, SysStringLen возвращает именно то количество, которое есть.
А вот первый...первый выдает ошибку. Почему-то выдает ошибку работы с памятью, мол неззя. И происходит это на SysReAllocString.


Кто может подсказать насколько я неправ?

UPD::

Есть подозрение на то что в строке как-то не так обрабатываются спец. символы, типа *, @ и т.д.
Пишите жизнь на чистовик.....переписать не удастся.....

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Конкатенация строк (сишникам)

Сообщение Хакер » 04.07.2010 (Вс) 19:39

SLIM писал(а):И все вроде бы работает.


Всё в сумме описывается одним словом:

SLIM писал(а):переобределится


Сколько же нужно ума
SLIM писал(а):Поэтому после объединения, я "перезанимал" занятую память с помощью SysReAllocString, так

чтобы делать это после?

Top-1 самых глупых идей плачет.

Перезаписать служебные структуры кучи строчкой, и сразу вслед за этим делать реструктуризацию кучи (для чего менеджеру кучи понадобится прочитать нагло уничтоженные служебные структуры) — это сильно, мощно.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: Конкатенация строк (сишникам)

Сообщение SLIM » 04.07.2010 (Вс) 22:43

Код: Выделить всё
LPTSTR lpAuxStr = (LPTSTR)malloc(sizeof(TCHAR) * 1000);
            wcscpy(lpAuxStr, L"declare @sql_handle varbinary(64) select @sql_handle = sql_handle from master.dbo.sysprocesses where spid=");
            wcscat(lpAuxStr, lpPID);
            wcscat(lpAuxStr, L" select * from ::fn_get_sql(@sql_handle) sql");
            
            bstrSQLQuery = SysAllocString(lpAuxStr);
            free((void*)lpAuxStr);

А так?
Пишите жизнь на чистовик.....переписать не удастся.....

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Конкатенация строк (сишникам)

Сообщение Хакер » 04.07.2010 (Вс) 23:01

Гадость.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: Конкатенация строк (сишникам)

Сообщение SLIM » 04.07.2010 (Вс) 23:04

Что именно гадость?
Пишите жизнь на чистовик.....переписать не удастся.....

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Конкатенация строк (сишникам)

Сообщение Хакер » 04.07.2010 (Вс) 23:11

Вишнёвый джем. Код.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: Конкатенация строк (сишникам)

Сообщение SLIM » 04.07.2010 (Вс) 23:14

Что именно в вишневом джеме гадость?
Какой-то конкретный символ\группа символов?
Пишите жизнь на чистовик.....переписать не удастся.....

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Re: Конкатенация строк (сишникам)

Сообщение BV » 05.07.2010 (Пн) 11:42

Гм. SLIM, если вызывает затруднение работа с BSTR посредством API, быть может, обратишь свое внимание на ATL, и на класс CComBSTR? У него есть замечательный метод, Append, который сам все корректно сделает
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

Joo
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 762
Зарегистрирован: 14.08.2008 (Чт) 11:55
Откуда: Казахстан

Re: Конкатенация строк (сишникам)

Сообщение Joo » 05.07.2010 (Пн) 17:04

Хакер писал(а):Гадость.

SLIM писал(а):Что именно гадость?

Мне нравится как он отвечает =) не когда не пояснит, в большинстве своем все ответы сводятся к "гадость", "дрянь" и в этом духе.
"Им будет не просто, тем кто полагается на истину авторитета, вместо того чтобы полагаться на авторитет Истины"
Джеральд Месси, Египтолог

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: Конкатенация строк (сишникам)

Сообщение SLIM » 05.07.2010 (Пн) 19:16

BV писал(а):Гм. SLIM, если вызывает затруднение работа с BSTR посредством API, быть может, обратишь свое внимание на ATL, и на класс CComBSTR? У него есть замечательный метод, Append, который сам все корректно сделает

Знаю такой класс. И удобно конечно с ним работать. Но раз уж начал все в коде делать "вручную", то лучше придерживаться этой концепции, ведь это добавляет знания к тому что я делаю, а в классе все таки все скрыто. Есть же еще и класс _bstr_t, там тоже есть удобные вещи.

Вроде бы последний гадо - код работает. А так, не знаю почему не предусмотрели API для конкатенации строк не знаю.
Joo писал(а):Мне нравится как он отвечает =) не когда не пояснит, в большинстве своем все ответы сводятся к "гадость", "дрянь" и в этом духе.

Ну, надеюсь он приведет код "не гадость" и мы скажем уау! Вполне может быть. Мы тут не спецы собрались.
А так да, из всех оценок помню одну не гадость - это интерфейс какой-то программы Saturn-а (она у него по-моему одна).
Пишите жизнь на чистовик.....переписать не удастся.....


Вернуться в С/С++

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8

    TopList