제가 알기로는 레지스트리에 있는 서브키의 리스트를
얻을수 있는것은 RegEnumKey이구요..
서브 Value의 리스트를 얻을수 있는 것은 RegEnumValue라고 알고 있거든요..
실제로 RegEnumKey를 사용해서 키값들을 구해서 사용하는데..
이번에는 Value 명을 얻어야 하는데.. 꼭 다음과 같은 에러가 나요...
---------------------------------------------------------------------
Types of actual and formal var parameters must be identical
---------------------------------------------------------------------
function GetSubValue(hkey : HKEY; subkey : string; var list : TStringList) : comp;
var
lRet, count : comp;
key1 : array[0..512] of char;
i : integer;
begin
i := 0;
count := 0;
FillChar(key1, sizeof(key1), #0);
lRet := RegOpenKeyEx(hkey, PChar(subkey), 0, KEY_READ, hkey);
if( lRet <> ERROR_SUCCESS) then
begin
RegCloseKey(hkey);
result := 0;
exit;
end;
RegQueryInfoKey(hkey, nil, nil, nil,nil, nil, nil,@count, nil, nil, nil, nil);
while i < count do
begin
FillChar(key1, sizeof(key1), #0);
-----------------------------------------------------------
RegEnumValue(hkey, i,key1,@lRet, nil,nil,nil,nil);
-----------------------------------------------------------
list.Add(key1);
i := i+ 1;
end;
RegCloseKey(hkey);
result := i;
end;
위 함수가 소스 전체구요...
실제로 RegEnumKey를 사용해서 위와 같은 형식으로 사용 하고 있거든요..
근데 문제가 되는 부분이 sizeof(key1) 이라는 부분입니다.
Delphi Help를 보면
LPDWORD lpcbValueName, // address for size of value buffer
라고 써있고 DWORD의 포인터지요? 그래서 lRet의 레퍼런스로 넣었는데
안맞는다고 나오네요...
꼭좀 가르쳐 주세요...
어떻게 RegEnumValue를 쓰셨는지...^^;;
함수 프로토타입은 API헬프보시지 마시고 Windows관련 유닛에서 직접찾으세요... API헬프에는 씨로된 프로토타입이 나와 있으니까요...
function RegEnumValue(hKey: HKEY; dwIndex: DWORD; lpValueName: PChar;
var lpcbValueName: DWORD; lpReserved: Pointer; lpType: PDWORD;
lpData: PByte; lpcbData: PDWORD): Longint; stdcall;
위와 같이 되어 있습니다. 그냥 DWORD변수를 넣어주시면 됩니다.
var
......
Len: DWORD;
begin
......
RegEnumValue(hkey, i,key1,Len, nil,nil,nil,nil);
......
end;
참고로 델파이의 TRegistry를 이용하시면 아주 간단하게 하실수도 있습니다.
uses
......, Registry;
function GetSubValue2(hkey : HKEY; subkey : string; var list : TStringList) : comp;
var
RegFile: TRegistry;
begin
RegFile := TRegistry.Create;
try
RegFile.RootKey := HKEY;
if RegFile.OpenKey(SubKey, False) then
RegFile.GetValueNames(List);
// 키값은 GetKeyNames메소드를 이용하시면 됩니다.
finally
RegFile.Free;
Result := List.Count;
end;
end;
^^ 항상 즐코하세요...