web-dev-qa-db-ja.com

cでのchar配列からLPCTSTRへの変換

Cでchar配列をLPCTSTRに変換する方法を知っている人はいますか?

編集:

詳細については、文字列に整数を追加してから、その文字列をWindows関数CreateFile()の最初のパラメーターのLPCTSTRに変換する必要があります。

これは私が現在使用しているハードコードされた例ですが、ポート番号として使用するには、任意の番号を渡すことができる必要があります。

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...

私はまた、LPCSTRケースで#1を試してみましたが、その価値は...

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...
11
Schuyler

キャストなしで、char配列を暗黙的にLPCSTRに変換できます。

_void SomeFunction(LPCSTR aString);
...
char myArray[] = "hello, world!";
SomeFunction(myArray);
_

LPCSTRは、定数文字列への長いポインタのWindowstypedefです。 Win16プログラミングの暗い時代には、さまざまな種類のポインタがありました:nearポインタとfarポインタ。shortおよびlongとも呼ばれます。 )それぞれポインタ。ニアポインタは、x86セグメントレジスタの1つによって決定されるメモリの64KBセグメントのみを指すことができます。遠いポインタは何でも指すことができます。現在、仮想メモリを備えたWin32では、ニアポインタは必要ありません。すべてのポインタが長いです。

したがって、LPSTRは、_char *_のtypedef、または文字列へのポインタです。 LPCSTRconstバージョンです。つまり、_const char *_のtypedefです。 Cでは、配列は最初の要素へのポインターに減衰するため、_char[]_は_char*_に減衰します。最後に、任意のタイプの「Tへのポインター」(任意のタイプTの場合)を暗黙的に「constTへのポインター」に変換できます。したがって、これら3つの事実を組み合わせると、_char[]_を暗黙的にLPCSTRに変換できることがわかります。


あなたの編集に応じて、私はあなたがUnicodeアプリケーションをコンパイルしていると推測します。 CreateFile() のドキュメントを注意深く見ると、filenameパラメーターが実際にはLPCTSTRではなくLPCSTRであることがわかります(Tに注意してください)。

ある文字列型の引数をとる(おそらく間接的に、つまりパラメータとして渡される構造のメンバーとして)ほとんどすべてのWin32関数には、実際にはその関数の2つのバージョンがあります。1つは8ビットのANSI文字列を取ります。 16ビットのワイド文字列を使用するもの。実際の関数名を取得するには、関数名にAまたはWを追加します。したがって、CreateFile()のANSIバージョンはCreateFileA()という名前で、ワイド文字バージョンはCreateFileW()という名前です。 Unicodeを有効にしてコンパイルしているかどうか(つまり、プリプロセッサシンボル__UNICODE_が定義されているかどうか)に応じて、シンボルCreateFileは_#define_ dからCreateFileAまたはCreateFileWのいずれかになり、他のすべての関数も同様になります。 ANSIとワイド文字バージョンがあります。

同じ行に沿って、タイプTCHARは、Unicodeが有効かどうかに応じて、typedefまたは_wchar_t_のいずれかにcharされ、LPCTSTRは_const TCHAR_へのポインターにtypedefされます。

したがって、コードを正しくするには、使用している文字列を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, ...);
_
34
Adam Rosenfield

Char配列はどの形式ですか?

const char[]または非const?

LPCSTRは、「定数文字列への長いポインタ」の(やや)紛らわしいMicrosoft名です。

LPCSTR bar = "hello";
const char *foo = bar;

const char *evil = "hello";
LPCSTR sauron = evil;

非constバージョンを取得する必要がある場合は、constnessをキャストするか、新しい配列にコピーします。私はおそらく後者を好むでしょう。多くの場合、変数は理由でconstであり、変数を変更することはほとんどの場合悪い習慣です。

3
Skurmedel

このようにしてみてください.........

TCHAR *pcCommPort = TEXT("COM1");
HANDLE h = CreateFile(pcCommPort,other arguments);
2
mgmskumara

TCHARの文字列関数があります。たとえば、TCHARを受け入れるstprintf_sを使用できます。このようにして、コードをユニコードまたはマルチバイト文字セットから「独立」させます。

コード(バリアント1)は次のようになります。

TCHAR portName[12] = { 0 };

stprintf_s( portName, sizeof( portName ) / sizeof(TCHAR), _T("\\\\.\\COM%i"), portNum );

CreateFile(portName...
1

「char配列をcでLPCSTRに変換する方法を知っている人はいますか?」

何もする必要はありません。自動的にそのタイプに変換されます(初期化子とsizeofを除く)。

「CreateFile(portName ...」

おそらく、VC++がコンパイル時に表示するエラーメッセージを教えてください。

おそらく、Adam Rosenfieldのwhcar_tバージョンが機能しなかったときに、VC++がどのようなエラーメッセージを表示したかも教えてください。

0
char* filename;
LPCTSTR ime = CA2W(filename);

これは文字列変換マクロであり、私のVS12で動作します

0
petar19992

あなたが最終的に何かを理解したかどうかはわかりませんが、私は同じ問題を抱えていて、次のことがうまくいきました:

int  comPortNum = 5;
char comPortName[32];
sprintf((LPTSTR)comPortName, TEXT("\\\\.\\COM%d"), comPortNum);
HANDLE h = CreateFile(comPortName,other arguments);
0
milkpirate

それは古い古典的な質問です。 UNICODEで使用しています。

char *pChar = "My Caption of My application";
    WCHAR wsz[512];
    swprintf(wsz, L"%S", pChar);
    SetWindowText(hWnd,         // ウィンドウまたはコントロールのハンドル
        wsz   // タイトルまたはテキスト
    );
0
bruce