Функция SysAllocStringByteLen() создаёт BSTR по ANSI-строке без перекодировки.
Поправил код 26.03.2011.
- Код: Выделить всё
#include <windows.h>
#include <stdio.h>
int main()
{
// Создаём массив из русских однобайтовых ANSI-символов. Восклицательный знак в конце стоит вместо
// возможного нуля из стека.
char input[] = {'Т', 'е', 'с', 'т', 'ы', '!'};
// Инициализируем бинарно-упакованную BSTR массивом ANSI-символов *нечётной* длины.
BSTR bStr = SysAllocStringByteLen(input, sizeof input - 1);
// Стандартным образом определяем длину бинарно-упакованной строки.
UINT bStrByteLen = SysStringByteLen(bStr);
// Для вывода русских символов на консоль перекодируем BSTR в OEM-кодировку,
// рассматривая её как массив ANSI-символов.
char output[sizeof input] = {'\0'};
CharToOemBuffA((char*)bStr, output, sizeof input - 1);
// Выводим длину BSTR в символах и в байтах. Показываем, что длина BSTR *в байтах* хранится
// перед первым символом. Печатаем строку.
printf("%d %d %u %s\n", SysStringLen(bStr), bStrByteLen, *((unsigned int*)bStr - 1), output);
// Освобождаем строку.
SysFreeString(bStr);
}
Результат: 2 5 5 Тесты
Ему нужно вызвать эту функцию из .NET, передав указатель на массив байт и получив IntPtr, а не String, а потом передать полученный указатель в нужный ему метод COM-интерфейса, принимающий BSTR. Первое видимо можно сделать при описании функции с помощью атрибутов, а вот как сделать второе моих знаний .NET не хватает, помогите.
В Капикоме функция ByteArrayToBinaryString() нужна была для подписи бинарных данных из VBScript, который не умеет работать с массивами байт. Например для подписи ANSI-строки в ASP она сначала конвертировалась с помощью функции, подобной StrToBin(), а потом уже подписывалась.
- Код: Выделить всё
function StrToBin(ByRef strMsg)
dim i, binMsg
for i = 1 to len(strMsg)
binMsg = binMsg & ChrB(Asc(Mid(strMsg, i, 1)))
next
StrToBin = binMsg
end function