CreateFile()の文字列をLPCWSTRに変換して、シリアルポートにアドレス指定します

StackOverflow https://stackoverflow.com/questions/3783842

質問

シリアルポートにアドレス指定するために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::wstringstd::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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top