Массив 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   // タイトルまたはテキスト
    );