バッファーはおそらく十分な大きさです。実際のサイズについて関数に嘘をついているだけです。
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
ください。間違った型を使用すると、コンパイル時にエラーが発生します。