Cでchar配列をLPCTSTRに変換する方法を知っている人はいますか?
編集:
詳細については、文字列に整数を追加してから、その文字列をWindows関数CreateFile()の最初のパラメーターのLPCTSTRに変換する必要があります。
これは私が現在使用しているハードコードされた例ですが、ポート番号として使用するには、任意の番号を渡すことができる必要があります。
CreateFile(_T("\\\\.\\COM11")... //hardcoded for com port 11
そして、これが私が試したいくつかのことです。これには、この投稿の次の2つの回答に対する次の提案が含まれていると思います。残念ながら動作しません。誰かが私が間違ったことを指摘し、私の問題を解決できる可能性があるなら、それをいただければ幸いです。
これらの例はすべて、portNumがすでに有効な値が割り当てられているintであることを前提としています。
char portName[12] = { 0 };
sprintf_s( portName, sizeof( portName ), "\\\\.\\COM%i", portNum );
CreateFile(portName...
私はまた、LPCSTRケースで#1を試してみましたが、その価値は...
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...
const char * portName = "";
sprintf_s( portName, sizeof( portName ), "\\\\.\\COM%i", portNum );
LPCSTR lpPortName = portName;
CreateFile(lpPortName...
キャストなしで、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、または文字列へのポインタです。 LPCSTR
はconst
バージョンです。つまり、_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, ...);
_
Char配列はどの形式ですか?
const char[]
または非const?
LPCSTRは、「定数文字列への長いポインタ」の(やや)紛らわしいMicrosoft名です。
LPCSTR bar = "hello";
const char *foo = bar;
const char *evil = "hello";
LPCSTR sauron = evil;
非constバージョンを取得する必要がある場合は、constnessをキャストするか、新しい配列にコピーします。私はおそらく後者を好むでしょう。多くの場合、変数は理由でconstであり、変数を変更することはほとんどの場合悪い習慣です。
このようにしてみてください.........
TCHAR *pcCommPort = TEXT("COM1");
HANDLE h = CreateFile(pcCommPort,other arguments);
TCHARの文字列関数があります。たとえば、TCHARを受け入れるstprintf_sを使用できます。このようにして、コードをユニコードまたはマルチバイト文字セットから「独立」させます。
コード(バリアント1)は次のようになります。
TCHAR portName[12] = { 0 };
stprintf_s( portName, sizeof( portName ) / sizeof(TCHAR), _T("\\\\.\\COM%i"), portNum );
CreateFile(portName...
「char配列をcでLPCSTRに変換する方法を知っている人はいますか?」
何もする必要はありません。自動的にそのタイプに変換されます(初期化子とsizeofを除く)。
「CreateFile(portName ...」
おそらく、VC++がコンパイル時に表示するエラーメッセージを教えてください。
おそらく、Adam Rosenfieldのwhcar_tバージョンが機能しなかったときに、VC++がどのようなエラーメッセージを表示したかも教えてください。
char* filename;
LPCTSTR ime = CA2W(filename);
これは文字列変換マクロであり、私のVS12で動作します
あなたが最終的に何かを理解したかどうかはわかりませんが、私は同じ問題を抱えていて、次のことがうまくいきました:
int comPortNum = 5;
char comPortName[32];
sprintf((LPTSTR)comPortName, TEXT("\\\\.\\COM%d"), comPortNum);
HANDLE h = CreateFile(comPortName,other arguments);
それは古い古典的な質問です。 UNICODEで使用しています。
char *pChar = "My Caption of My application";
WCHAR wsz[512];
swprintf(wsz, L"%S", pChar);
SetWindowText(hWnd, // ウィンドウまたはコントロールのハンドル
wsz // タイトルまたはテキスト
);