2009-08-23 3 views
0

Мы переносим наше приложение C++ COM в unicode, и в рамках этой миграции мы хотим также перенести константные строки в нашем IDL в unicode.Как объявить широкую константу char в IDL

Проблема в том, что в настоящий момент мы все еще собираем ее как в ANSI, так и в UNICODE, что означает, что мы не можем использовать конструкцию L "String" для объявления широких диаграмм.

На данный момент наша строковая константа определяется следующим образом:

Const LPSTR STRING_CONST_NAME = "строковое значение";

И мы хотим, чтобы определить его как это:

сопзЬ LP T STR STRING_CONST_NAME = "строковое значение";

Если бы регулярный код, который мы бы просто добавить _T («строковое значение») макрос, который бы превратил его в L «строковое значение» при компиляции в юникоде

Но от того, что я могу видеть, что мы можем» t использовать его в IDL, потому что _T является чистой конструкцией C++.

Является ли наш подход даже правильным? Может быть, мы должны определить его, как это ни на что:

Const LP T STR STRING_CONST_NAME = L «строковое значение»;

ответ

2

Интересно, почему в любом случае вам нужно иметь строковые константы в файле IDL. Не было бы достаточно, чтобы они были в файле заголовка? Я вижу, что Microsoft имеет широкие строковые литералы только в sapiaut.idl (глядя на все файлы IDK SDK платформы); так как эти несколько констант никогда не используются, это могло быть ошибкой. Также обратите внимание, что эти константы определены как BSTR.

Если вы хотите их в файле IDL, может быть достаточно, чтобы cpp_quote их.

Если вы абсолютно хотите их в IDL буквально, вы можете использовать #ifdef, чтобы иметь два разных определения. В этом случае у вас также должны быть две библиотеки разных типов с отдельными наборами интерфейсов с различными UUID и т. Д.

+0

Мы определяем их как consts, потому что мы их потребляем позже в других местах нашего API. Многие из наших методов API принимают эти строки как параметры, и их проще определить один раз в COM-api и использовать их позже во всех своих клиентах. Я проверю ваш вопрос об определении их как BSTR, который, возможно, был нашей ошибкой с самого начала. –

+0

Я бы назвал их BSTR ошибкой - BSTRs _must_ будет выделен с использованием SysAllocString. Строковые строки с широким символом недействительны BSTR, так как они не могут быть префиксом длины. –

0

Если это всегда должно быть Unicode, использовать конструкции «Т» просто не нужно - просто сделайте;

const LPCWSTR STRING_CONST_NAME = L"STRING VALUE"; 

"W" для "широкого" -

Не уверен, как Windows, определенный LPC * STR взаимодействие с определением типов IDL, но если LPSTR работал, широкое разнообразие должно работать, тоже.