Есть значит 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::
Есть подозрение на то что в строке как-то не так обрабатываются спец. символы, типа *, @ и т.д.