CreateFile()の文字列をLPCWSTRに変換して、シリアルポートにアドレス指定します
-
05-10-2019 - |
質問
シリアルポートにアドレス指定するためにWindows CreateFile関数を使用する場合、私はテキスト / Unicodeの問題を少し持っているようです。誰かが私のエラーを指摘するのを手伝ってもらえますか?
VS 2008を使用して、VC ++でWin32コンソールアプリケーションを書いています。
このようなシリアルポートに対処するためのハンドルを作成できます。
#include <iostream>
#include <windows.h>
#include <string>
int main()
{
HANDLE hSerial;
hSerial = CreateFile( L"\\\\.\\COM20",
GENERIC_READ | GENERIC_WRITE,
0,
0,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
0);`
return 0;
}
それはうまく機能します( \\\\.\\
COM9よりも大きいコンポートにはBITが必要であり、COM9までのものにも機能します)。問題は、私のコンポートが常にCOM20であるとは限らないため、ユーザーにそれが何であるかを指定させたいということです。
これが私が試したいくつかのことです:
#include <iostream>
#include <windows.h>
#include <string>
int main()
{
std::string comNum;
std::cout << "\n\nEnter the port (ex: COM20): ";
std::cin >> comNum;
std::string comPrefix = "\\\\.\\";
std::string comID = comPrefix+comNum;
HANDLE hSerial;
hSerial = CreateFile( comID,
GENERIC_READ | GENERIC_WRITE,
0,
0,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
0);`
return 0;
}
これはコンパイルされず、エラーを返します。 エラーC2664: 'CreateFilew':パラメーター1を「std :: string」から「lpcwstr」に変換できません
createfileaが機能することを指定するかもしれないと思いましたが、それは基本的に同じエラーを与えました。
私も試しました:
/*
everything else the same
*/
hSerial = CreateFile( TEXT(comID),
GENERIC_READ | GENERIC_WRITE,
0,
0,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
0);`
これもコンパイルされず、戻ります。 エラーC2065: 'lcomid':宣言されていない識別子
私は専門家ではありませんが、しばらくの間これに取り組んでいます。誰かが交換方法を教えてもらえますか L"\\\\.\\COM20"
ユーザーがコンポートを指定し、CreateFileがまだ機能するようにするような方法で?ありがとう!
解決
どちらかを使用できます std::wstring
と std::wcin
, std::wcout
「Unicode文字列」で直接入力を実行するか、Microsoftのものを調べることができます 変換機能.
最初のオプション(推奨)に行く場合でも、 c_str()
aにアクセスする機能 LPCWSTR
値(へのポインター const wchar_t
).
サンプルソリューション(も使用しません CreateFileW
構文、問題を防ぐため UNICODE
大きい):
#include <iostream>
#include <windows.h>
#include <string>
int main()
{
std::wstring comNum;
std::wcout << L"\n\nEnter the port (ex: COM20): ";
std::wcin >> comNum;
std::wstring comPrefix = L"\\\\.\\";
std::wstring comID = comPrefix+comNum;
HANDLE hSerial;
hSerial = CreateFileW( comID.c_str(),
GENERIC_READ | GENERIC_WRITE,
0,
0,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
0);`
return 0;
}
他のヒント
使い続けたい場合 std::string
, 、それを使用します c_str()
呼び出すときの方法 CreateFileA()
, 、例:
hSerial = CreateFileA( comID.c_str(), ...);
追加の参照として、ATL変換マクロ(例:CA2CWなど)をご覧ください。これら(適切に使用する場合)は、ほとんどすべての単純な変換ケースをインラインで処理でき、ほとんど騒ぎません。
あなたの例では、std :: stringを使用して、次を使用できます。
CreateFile( CA2CT( comID.c_str() ), ... );
(何らかの理由で)ANSI文字列を使用し続けることにした場合、 MultiByteToWideChar
働き。しかし、ANSI弦はかなり時代遅れです。
私は最近これに出くわしました。 Unicodeはこのアプリケーションの範囲外であったため、単純にUnicodeを無効にしました。
ここの文字列変換に関する一般情報: http://www.codeproject.com/kb/string/cppstringguide2.aspx