Массив char для преобразования LPCTSTR в c
Кто-нибудь знает, как преобразовать массив char в LPCTSTR в c?
Edit:
Для дополнительной справки мне нужно добавить целое число в строку, а затем преобразовать эту строку в LPCTSTR для первого параметра функции Windows CreateFile().
Это жесткий код, который я использую в настоящее время, но мне нужно иметь возможность передавать любое число для использования в качестве номера порта.
CreateFile(_T("\\\\.\\COM11")... //hardcoded for com port 11
и вот несколько вещей, которые я пробовал, которые, я считаю, включают следующие предложения для следующих 2 ответов этого сообщения. К сожалению, они не работают. Если бы кто-нибудь мог указать на то, что я сделал неправильно, и мог бы решить мою проблему, я был бы признателен.
Все эти примеры предполагают, что portNum - это int, которому уже присвоено допустимое значение
1
char portName[12] = { 0 };
sprintf_s( portName, sizeof( portName ), "\\\\.\\COM%i", portNum );
CreateFile(portName...
Я также пробовал # 1 с футляром LPCSTR за то, что он стоит...
2
LPCSTR SomeFunction(LPCSTR aString) {
return aString;
}
main() {
char portName[12] = { 0 };
sprintf_s( portName, sizeof( portName ), "\\\\.\\COM%i", portNum );
LPCSTR lpPortName = SomeFunction(portName);
CreateFile(lpPortName...
3
const char * portName = "";
sprintf_s( portName, sizeof( portName ), "\\\\.\\COM%i", portNum );
LPCSTR lpPortName = portName;
CreateFile(lpPortName...
Ответы
Ответ 1
Вы можете неявно преобразовать массив char в LPCSTR
без каких-либо отбрасываний:
void SomeFunction(LPCSTR aString);
...
char myArray[] = "hello, world!";
SomeFunction(myArray);
An LPCSTR
- это typedef для длинного указателя на постоянную строку. В темные дни программирования Win16 существовали разные типы указателей: около указателей и дальних указателей, иногда также называемых короткими и длинными указателями соответственно. Рядом с указателями можно указать только сегмент памяти на 64 Кбайт, определенный одним из регистров сегмента x86. Дальние указатели могли указать на что угодно. В настоящее время в Win32 с виртуальной памятью нет необходимости в ближайших указателях - все указатели длинны.
Итак, LPSTR
является typedef для char *
или указателем на строку. LPCSTR
- это const
версия, т.е. Это typedef для const char *
. В C массивы распадаются на указатели на их первые элементы, поэтому a char[]
распадается на a char*
. Наконец, любой тип "указателя на T" (для любого типа T) может быть неявно преобразован в "указатель на const T". Таким образом, объединяя эти три факта, мы видим, что мы можем неявно преобразовать a char[]
в LPCSTR
.
В ответ на ваше редактирование, я собираюсь предположить, что вы компилируете приложение Unicode. Если вы внимательно посмотрите документацию для CreateFile()
, вы заметите, что параметр имени файла на самом деле является LPCTSTR
, а не LPCSTR
(обратите внимание на T
).
Для почти каждой функции Win32, которая принимает аргумент некоторого строкового типа (возможно, косвенно, т.е. как элемент структуры, переданной как параметр), на самом деле есть две версии этой функции: одна, которая принимает 8-битный ANSI строки, и один, который принимает 16-битные широкосимвольные строки. Чтобы получить имена фактических функций, вы добавляете имя функции A
или W
к имени функции. Таким образом, версия ANSI CreateFile()
называется CreateFileA()
, а широкоформатная версия называется CreateFileW()
. В зависимости от того, выполняется ли компиляция с включенным Unicode (т.е. Определяется ли символ препроцессора _UNICODE
), символ CreateFile
равен #define
d для CreateFileA
или CreateFileW
, а также для каждая другая функция, имеющая ANSI и широкоформатную версию.
В тех же строках тип TCHAR
равен typedef
ed либо char
, либо wchar_t
, в зависимости от того, включен ли Unicode, а LPCTSTR
- typedef
ed указателю на const TCHAR
.
Таким образом, чтобы ваш код был правильным, вы должны заменить строки, которые вы используете, на строки TCHAR
, и использовать типовую версию sprintf_s
, _stprintf_s
:
TCHAR portName[32];
_stprintf_s(portName, sizeof(portName)/sizeof(TCHAR), _T("\\\\.\\COM%d"), portNum);
CreateFile(portName, ...);
Кроме того, вы можете явно использовать версии ANSI или широкоформатные версии всего:
// Use ANSI
char portName[32];
sprintf_s(portName, sizeof(portName), "\\\\.\\COM%d", portNum);
CreateFileA(portName, ...);
// Use wide-characters
wchar_t portName[32];
swprintf_s(portName, sizeof(portName)/sizeof(wchar_t), L"\\\\.\\COM%d", portNum);
CreateFileW(portName, ...);
Ответ 2
В каком формате находится ваш массив char?
Является ли это const char[]
или не константой?
LPCSTR - это просто (несколько) запутанное имя Microsoft для "Long Pointer to Constant String".
LPCSTR bar = "hello";
const char *foo = bar;
const char *evil = "hello";
LPCSTR sauron = evil;
Если вам нужна неконстантная версия, вы либо отбрасываете константу, либо копируете ее в новый массив. Вероятно, я предпочел бы последнее. Переменные часто являются константами по определенной причине, и их изменение почти всегда является плохим.
Ответ 3
попробуйте вот так.........
TCHAR *pcCommPort = TEXT("COM1");
HANDLE h = CreateFile(pcCommPort,other arguments);
Ответ 4
У вас есть строковые функции для TCHAR. Вы можете использовать, например, stprintf_s, принимающий TCHAR. Таким образом, вы делаете код "независимым" от уникода или многобайтового набора символов.
Ваш код (вариант 1) становится:
TCHAR portName[12] = { 0 };
stprintf_s( portName, sizeof( portName ) / sizeof(TCHAR), _T("\\\\.\\COM%i"), portNum );
CreateFile(portName...
Ответ 5
"Кто-нибудь знает, как преобразовать массив char в LPCSTR в c?"
Вам не нужно ничего делать. Он автоматически преобразуется в этот тип (за исключением инициализаторов и sizeof).
"CreateFile (PortName..."
Возможно, вы должны сообщить нам сообщение об ошибке, которое VС++ дает вам во время компиляции?
Возможно, вы также должны сообщить нам, какое сообщение об ошибке, которое VС++ предоставила вам, когда версия для вас не была разработана Adam Rosenfield whcar_t?
Ответ 6
Я не уверен, что в конце концов вы что-то поняли, но у меня была такая же проблема, и после этого хорошо сработало для меня:
int comPortNum = 5;
char comPortName[32];
sprintf((LPTSTR)comPortName, TEXT("\\\\.\\COM%d"), comPortNum);
HANDLE h = CreateFile(comPortName,other arguments);
Ответ 7
char* filename;
LPCTSTR ime = CA2W(filename);
Это макрос преобразования строк и работает на моем VS12
Ответ 8
Это старый классический вопрос. Я использую его в UNICODE.
char *pChar = "My Caption of My application";
WCHAR wsz[512];
swprintf(wsz, L"%S", pChar);
SetWindowText(hWnd, // ウィンドウまたはコントロールのハンドル
wsz // タイトルまたはテキスト
);