Так как данные статические _SysAllocString & _SysFreeString токо засаряют код, посему искал макорсы но не нашёл. Своим умом придумал токо два варианта и оба совсем не идиальные: #define BSTRDEF(NAME,_NAME,WSTR) DWORD _NAME=sizeof(WSTR); WCHAR NAME[]=WSTR этот можно использовать только в глобальных переменных(можно перед функцией для удобства) т.к. там данные идут последовательно. Имя для переменной DWORD динамически определить не додумкал как, поэтому есть ещё параметр её имени - _NAME Код (Text): #define BSTRDEF(NAME,_NAME,WSTR) DWORD _NAME=sizeof(WSTR); WCHAR NAME[]=WSTR BSTRDEF(bstr,_bstr,L"MIR!!!"); .... pEl->put_innerHTML(bstr); .... } Второй вариант менее коряв и определять его можно везде, но для него даже макрос сделать не смог, а может и вообще не возможно, поэтому нужно самому вбивать размер строки в байтах(для маленьких строк впринципе нормально) : WCHAR wstr=L"\8\0bstr"; тоесть bstr будет указатель на второй элемент &wstr[2] тут удебен вот такой дефайн: #define bdef(WSTR) &(WSTR)[2]; Код (Text): #define bdef(WSTR) &(WSTR)[2]; .... pEl->put_innerHTML(bstr(L"\8\0bstr")); .... Сабж: Возможны ли нормальные макросы?
Вообще это немного извращенские подходы для С++. По-моему логичнее определить класс у которого были-бы соответствующие конструктор и оператор приведения. Да и вроде такой уже есть - _bstr_t. ^)
Я чтото не понял, а что сложного то? Код (Text): #define STATIC_BSTR(NAME,STR) \ WCHAR _##NAME##_BUF[2+sizeof(STR)/2] = { \ ((sizeof(STR)-2) & 0xFFFF), \ (((sizeof(STR)-2) >> 16) & 0xFFFF), \ STR }; \ WCHAR *NAME = &_##NAME##_BUF[2];
Вообще-то это не BSTR. BSTR - это unicode-строка, которая возвращается SysAllocString и расшаривается между процессами. Если вы put_блабла сделаете элементу, который находится в другом процессе (ИЕ), то ничего работать не будет.
Booster потому что я дурак Great пробовал, у меня такое не копмиллит(lcc), тоесть чем иницилзировать указывает первый элемент и дальше он подрозумевает, что остальные будут этого же типа, иначе ошибки об несовместимомти типов: WCHAR wstr[]="sdsdsad" "asdasd"; ok WCHAR wstr[]=12,23,235; ok WCHAR wstr[]={12,24,21312,"sdsdsad"}; error здесь он посчитает, что "sdsdsad" это указатель на ushort ,а будет требовать ushort как предыдущие. причём со структурами такая же неладность... в них даже строкой можно иницилизировать только первый элемент(массив). а ты на чём?
prorok ну или пиши через ж как ты писал &L"\x04\x00bstr"[2], либо SysAllocString - она даже документирована и для разных процессов сойдет как говорила моя школьная учительница, не надо умничать там, где не требуется -))
Great эхх, я его даже скачал когда-то, чувствовал, что понадобится. PS моя говорила - краткость сестра таланта, но не в твоём случае.
Поставил я ms visual 2005, компиллил nmake ом , всплыли каието манифесты и всё что с ними связано.... Есть какой ни-будь нормальный С\С++ компилятор, да чтоб проекты с командной строки можно было без проблем собирать?