Какой тип строки лучше всего использовать для Win32 и DirectX?

Я нахожусь в процессе разработки небольшой игры в DirectX 10 и C++, и я нахожу это адским с различными типами строк, которые требуются для различных вызовов функций DirectX/win32.

Может ли кто-нибудь порекомендовать, какие из доступных строк лучше всего использовать, в идеале это должен быть один тип строки, который дает хорошее приведение к другим типам (в основном LPCWSTR и LPCSTR). До сих пор я использовал std::string и std::wstring и выполнял функцию .c_str(), чтобы получить ее в правильном формате.

Я хотел бы получить только 1 тип строки, который я использую для передачи во все функции, а затем выполняю приведение внутри функции.


person Ian Cant    schedule 24.01.2012    source источник


Ответы (3)


Используйте std::wstring с c_str() точно так же, как вы это делали. Я не вижу причин использовать std::string в Windows, ваш код может всегда использовать родную кодировку UTF-16.

person David Heffernan    schedule 24.01.2012
comment
Это отлично работает, но мне трудно найти, как выполнить приведение между std::wstring и LPCSTR, поскольку выполнение этого через c_str() не работает. - person Ian Cant; 24.01.2012
comment
Я бы просто перестал вызывать функции ANSI. Вызывайте только функции Unicode. Если вам просто необходимо это сделать, то получите или напишите функции преобразования, которые преобразуют между string и wstring. - person David Heffernan; 24.01.2012
comment
К сожалению, API DirectX10 не дает мне такого комфорта. Ряд объектов, возвращаемых вызовами D3D, принимают только значения ANSI, например: msdn.microsoft.com/en-us/library/windows/desktop/ - person Ian Cant; 24.01.2012
comment
Глядя на этот API, кажется, что входные параметры не могут быть переменными в вашей программе. Если да, то просто объявите их как const char* MyTechniqueName = "....". Для такого API, поскольку он не может принимать текст Unicode, я думаю, вы должны сохранить значение в своей программе как ANSI. Нет смысла хранить как Unicode и преобразовывать, так как преобразование может завершиться неудачей. Поэтому используйте wstring там, где доступен API Unicode, в противном случае используйте string. - person David Heffernan; 24.01.2012
comment
Вы можете использовать экземпляр std::wstring_convert, чтобы легко преобразовать wstring в string, а затем использовать c_str(). convert(my_wstring).to_bytes().c_str(). - person bames53; 25.01.2012

Я бы тоже придерживался std::wstring. Если вам действительно нужно куда-то передать std::string, вы все равно можете преобразовать его на лету:

std::string s = "Hello, World";
std::wstring ws(s.begin(), s.end());

Это работает и наоборот.

person nijansen    schedule 24.01.2012
comment
К сожалению, я не могу отметить несколько ответов как правильные, так как это, конечно, не так. - person Ian Cant; 24.01.2012

Если вы используете Native COM (материал #import <type_library>), то _bstr_t. Он изначально выполняет приведение типов как к LPCWSTR, так и к LPCSTR, и хорошо сочетается с моделью распределения памяти COM. Нет необходимости в .c_str() звонках.

person Seva Alekseyev    schedule 24.01.2012
comment
Опять же, жаль, что я не могу отметить несколько ответов правильными, хотя, поскольку это для университетского задания, они не слишком заинтересованы в том, чтобы мы использовали COM. Спасибо, - person Ian Cant; 24.01.2012
comment
DirectX является основанным на COM. Вы не можете с этим поделать. Для остальной части Win32 подойдет wstring, но специально для DirectX вам лучше иметь строку, удобную для COM. - person Seva Alekseyev; 24.01.2012
comment
@Seva DX не имеет много методов с BSTR параметрами IIRC - person David Heffernan; 24.01.2012