0

レジストリからすべてのコンポートを取得しようとしています。残念ながら、私は常に ERROR_MORE_DATA エラーを受け取ります...既にバッファを大きくしようとしましたが、まったく役に立ちません。これが私のコードです:

DWORD registry::regGetValue(char *key, int index)
{
HKEY hKey; 
 RegOpenKeyEx(HKEY_LOCAL_MACHINE,"HARDWARE\\DEVICEMAP\\SERIALCOMM",0,KEY_ALL_ACCESS,&hKey);
     DWORD chars = sizeof(key);
     LONG result = RegEnumValue(hKey, index, key, &chars, 0,0,0,0 );
 RegCloseKey(hKey);
 return result;
}

パラメータは次のとおりです。

char key[512];
int index = 0;
4

2 に答える 2

2

バッファーはおそらく十分な大きさです。実際のサイズについて関数に嘘をついているだけです。

sizeofポインターで演算子を使用すると、ポインターが指す配列のサイズではなく、ポインターのサイズが返されます。また、keyは として関数に渡されるためchar*、配列自体ではなく、単なる配列へのポインターです。

ポインタとともに、バッファの実際のサイズをパラメータとして関数に渡す必要があります。

DWORD regGetValue(char *key, size_t length, int index)
{
   HKEY hKey; 
   RegOpenKeyEx(HKEY_LOCAL_MACHINE,"HARDWARE\\DEVICEMAP\\SERIALCOMM",0,KEY_ALL_ACCESS,&hKey);
   DWORD chars = length;
   LONG result = RegEnumValue(hKey, index, key, &chars, 0,0,0,0 );
   RegCloseKey(hKey);
   return result;
}
char key[512];
int index = 0;
regGetValue(key, sizeof(key), index);

このsizeof演算子は、単に配列へのポインターではなく、配列自体を操作しているため、ここでは期待どおりに機能します。このアプローチは、C API では一般的ですが、面倒です。

バッファーのサイズを自動的に推定し、実際に作業を行う内部ヘルパー関数に渡す関数テンプレートを使用することで、呼び出しサイトでの処理を少し単純化できます。

// Helper function, implemented as a private member of your class
DWORD regGetValue(char *key, size_t length int index)
{
   HKEY hKey; 
   RegOpenKeyEx(HKEY_LOCAL_MACHINE,"HARDWARE\\DEVICEMAP\\SERIALCOMM",0,KEY_ALL_ACCESS,&hKey);
   DWORD chars = length;
   LONG result = RegEnumValue(hKey, index, key, &chars, 0,0,0,0 );
   RegCloseKey(hKey);
   return result;
}

// The public function that you will actually call
template <size_t N>
DWORD regGetValue(char (&key)[N], int index)
{
   return regGetValue(key, N, index);
}
char key[512];
int index = 0;
regGetValue(key, index);  // length determined and passed automatically

これは、ポインターではなく、配列への参照を渡すために機能します。

それとは別に、なぜANSI関数を呼び出しchar*て文字列に使用しているのかを真剣に疑問視する必要があります. 最新の Windows アプリケーションはすべて Unicode にする必要があります。これはW、Windows API 関数のサフィックス バージョンを呼び出し、wchar_t*文字列型として使用することを意味します。UNICODEプロジェクトにとシンボルの両方が定義されていることを確認して_UNICODEください。間違った型を使用すると、コンパイル時にエラーが発生します。

于 2013-07-25T13:53:28.290 に答える
0

MSDN によると: lpName バッファーが小さすぎてキーの名前を受信できない場合、関数は ERROR_MORE_DATA を返します。を呼び出す前にRegEnumKeyEx、関数を呼び出しRegQueryInfoKeyて、 で識別されるキーの最大サブキーのサイズを決定できますhKey。の使用法は次の場所にありRegQueryInfoKeyます: " http://msdn.microsoft.com/en-us/library/windows/desktop/ms724902(v=vs.85).aspx "

于 2013-07-25T13:51:27.740 に答える