Нужен макрос для инициализации BSTR-строки

Тема в разделе "LANGS.C", создана пользователем prorok, 23 май 2009.

  1. prorok

    prorok New Member

    Публикаций:
    0
    Регистрация:
    25 янв 2009
    Сообщения:
    25
    Так как данные статические _SysAllocString & _SysFreeString токо засаряют код, посему искал макорсы но не нашёл.
    Своим умом придумал токо два варианта и оба совсем не идиальные:

    #define BSTRDEF(NAME,_NAME,WSTR) DWORD _NAME=sizeof(WSTR); WCHAR NAME[]=WSTR

    этот можно использовать только в глобальных переменных(можно перед функцией для удобства) т.к. там данные идут последовательно. Имя для переменной DWORD динамически определить не додумкал как, поэтому есть ещё параметр её имени - _NAME

    Код (Text):
    1. #define BSTRDEF(NAME,_NAME,WSTR) DWORD _NAME=sizeof(WSTR); WCHAR NAME[]=WSTR
    2.  
    3. BSTRDEF(bstr,_bstr,L"MIR!!!");
    4. ....
    5. pEl->put_innerHTML(bstr);
    6. ....
    7. }
    Второй вариант менее коряв и определять его можно везде, но для него даже макрос сделать не смог, а может и вообще не возможно, поэтому нужно самому вбивать размер строки в байтах(для маленьких строк впринципе нормально) :

    WCHAR wstr=L"\8\0bstr";

    тоесть bstr будет указатель на второй элемент &wstr[2]

    тут удебен вот такой дефайн:
    #define bdef(WSTR) &(WSTR)[2];

    Код (Text):
    1. #define bdef(WSTR) &(WSTR)[2];
    2. ....
    3. pEl->put_innerHTML(bstr(L"\8\0bstr"));
    4. ....
    Сабж: Возможны ли нормальные макросы?
     
  2. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Вообще это немного извращенские подходы для С++. По-моему логичнее определить класс у которого были-бы соответствующие конструктор и оператор приведения. Да и вроде такой уже есть - _bstr_t. ^)
     
  3. prorok

    prorok New Member

    Публикаций:
    0
    Регистрация:
    25 янв 2009
    Сообщения:
    25
    забыл сказать, что для Си =)
     
  4. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Я чтото не понял, а что сложного то?

    Код (Text):
    1. #define STATIC_BSTR(NAME,STR) \
    2.     WCHAR _##NAME##_BUF[2+sizeof(STR)/2] = { \
    3.         ((sizeof(STR)-2) & 0xFFFF), \
    4.         (((sizeof(STR)-2) >> 16) & 0xFFFF), \
    5.         STR }; \
    6.     WCHAR *NAME = &_##NAME##_BUF[2];
     
  5. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    А что именно Си? put_innerHTML наводит на мысль, что С++ вполне прокатит.
     
  6. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    PS. Юзать

    STATIC_BSTR (sample_bstr, L"hello, world!");
     
  7. barton

    barton New Member

    Публикаций:
    0
    Регистрация:
    19 июл 2008
    Сообщения:
    164
    Адрес:
    Czechoslovakia
    Вообще-то это не BSTR.
    BSTR - это unicode-строка, которая возвращается SysAllocString и расшаривается между процессами.
    Если вы put_блабла сделаете элементу, который находится в другом процессе (ИЕ), то ничего работать не будет.
     
  8. prorok

    prorok New Member

    Публикаций:
    0
    Регистрация:
    25 янв 2009
    Сообщения:
    25
    Booster
    потому что я дурак

    Great
    пробовал, у меня такое не копмиллит(lcc), тоесть чем иницилзировать указывает первый элемент и дальше он подрозумевает, что остальные будут этого же типа, иначе ошибки об несовместимомти типов:

    WCHAR wstr[]="sdsdsad" "asdasd"; ok
    WCHAR wstr[]=12,23,235; ok
    WCHAR wstr[]={12,24,21312,"sdsdsad"}; error
    здесь он посчитает, что "sdsdsad" это указатель на ushort ,а будет требовать ushort как предыдущие.

    причём со структурами такая же неладность... в них даже строкой можно иницилизировать только первый элемент(массив).


    а ты на чём?
     
  9. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    выброси свой lcc.
    я на ms visual c
     
  10. prorok

    prorok New Member

    Публикаций:
    0
    Регистрация:
    25 янв 2009
    Сообщения:
    25
    barton
    у меня робит тк с ИЕ всё в шеколаде;)
     
  11. prorok

    prorok New Member

    Публикаций:
    0
    Регистрация:
    25 янв 2009
    Сообщения:
    25
    Great
    ((другого выхода нет?
     
  12. barton

    barton New Member

    Публикаций:
    0
    Регистрация:
    19 июл 2008
    Сообщения:
    164
    Адрес:
    Czechoslovakia
    Значит com клиент том же процессе, что и com сервер
     
  13. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    prorok
    ну или пиши через ж как ты писал &L"\x04\x00bstr"[2], либо SysAllocString - она даже документирована и для разных процессов сойдет ;)

    как говорила моя школьная учительница, не надо умничать там, где не требуется -))
     
  14. barton

    barton New Member

    Публикаций:
    0
    Регистрация:
    19 июл 2008
    Сообщения:
    164
    Адрес:
    Czechoslovakia
    Ты её уроки часто прогуливал?)

    Дык она потому и говорила, что я часто так умничал))
     
  15. prorok

    prorok New Member

    Публикаций:
    0
    Регистрация:
    25 янв 2009
    Сообщения:
    25
    Great
    эхх, я его даже скачал когда-то, чувствовал, что понадобится.

    PS моя говорила - краткость сестра таланта, но не в твоём случае.
     
  16. prorok

    prorok New Member

    Публикаций:
    0
    Регистрация:
    25 янв 2009
    Сообщения:
    25
    Поставил я ms visual 2005, компиллил nmake ом , всплыли каието манифесты и всё что с ними связано....

    Есть какой ни-будь нормальный С\С++ компилятор, да чтоб проекты с командной строки можно было без проблем собирать?
     
  17. megaaa

    megaaa New Member

    Публикаций:
    0
    Регистрация:
    29 май 2009
    Сообщения:
    51
  18. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    prorok
    надо просто отключить манифесты ;)
    и все без проблем соберется.
     
  19. prorok

    prorok New Member

    Публикаций:
    0
    Регистрация:
    25 янв 2009
    Сообщения:
    25
    буду глядеть на VS, а сидеть пока что на lccwin32
     
  20. MirrorBlack

    MirrorBlack Алексей

    Публикаций:
    0
    Регистрация:
    21 июн 2008
    Сообщения:
    249
    Адрес:
    Moscow
    prorok
    Погляди на VS2008pro + Visual Assist, правда оба платные :)