11

誰かが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...
4

8 に答える 8

34

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

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

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

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


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

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

同じ行に沿って、タイプTCHARはUnicodeが有効になっているかどうかに応じて、またはのtypedefいずれかに編集され、。へのポインターに編集されます。charwchar_tLPCTSTRtypedefconst 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, ...);
于 2009-06-10T16:15:48.073 に答える
3

char配列はどのような形式ですか?

それはaconst char[]またはnon-constですか?

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

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

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

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

于 2009-06-10T16:07:58.743 に答える
2

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

TCHAR *pcCommPort = TEXT("COM1");
HANDLE h = CreateFile(pcCommPort,other arguments);
于 2011-09-29T19:26:57.370 に答える
1

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

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

TCHAR portName[12] = { 0 };

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

CreateFile(portName...
于 2009-06-12T13:26:43.667 に答える
1
char* filename;
LPCTSTR ime = CA2W(filename);

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

于 2015-01-22T07:21:02.197 に答える
0

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

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

「CreateFile(portName...」

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

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

于 2009-06-12T03:41:58.190 に答える
0

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

int  comPortNum = 5;
char comPortName[32];
sprintf((LPTSTR)comPortName, TEXT("\\\\.\\COM%d"), comPortNum);
HANDLE h = CreateFile(comPortName,other arguments);
于 2013-12-12T22:50:40.247 に答える
0

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

char *pChar = "My Caption of My application";
    WCHAR wsz[512];
    swprintf(wsz, L"%S", pChar);
    SetWindowText(hWnd,         // ウィンドウまたはコントロールのハンドル
        wsz   // タイトルまたはテキスト
    );
于 2017-04-07T17:05:13.010 に答える