Marcus Meissner wrote:
Please give more details on that bug.
I'll go one better. Attached is a test case. In Windows, RegEnumValue returns the keys in the order they were created in. Wine will, of course, reorder them. Shachar mentions newer versions of Explorer depend on Windows behaviour - I don't know about that, but I do know that the Tool palette in Borland C++Builder 5 appears in the wrong order because it depends on the keys not being reordered.
The test case runs on WinXP without error. Since apps depend on this behaviour, I'm assuming it's not windows-version dependent.
-- Jon Bright Lead Programmer, Silicon Circus Ltd. http://www.siliconcircus.com
//--------------------------------------------------------------------------- #include <windows.h> #include <stdio.h> #pragma hdrstop //---------------------------------------------------------------------------
int fail(char *stage) { printf("FAILED: %s\n",stage); return -1; }
#pragma argsused int main(int argc, char* argv[]) { HKEY software, wine, regorder; char name[2]; DWORD i,nsize,type,ri,risize,disp;
if (RegCreateKeyEx(HKEY_CURRENT_USER,"Software",0,NULL,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,NULL,&software,&disp)!=ERROR_SUCCESS) return fail("Create-Software"); if (RegCreateKeyEx(software,"Wine",0,NULL,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,NULL,&wine,&disp)!=ERROR_SUCCESS) return fail("Create-Wine"); if (RegCreateKeyEx(wine,"TestRegOrder",0,NULL,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,NULL,®order,&disp)!=ERROR_SUCCESS) return fail("Create-TestRegOrder");
name[1]='\0'; for (i=26; i; i--) { name[0]='A'+i-1; if (RegSetValueEx(regorder,name,0,REG_DWORD,(BYTE*)&i,sizeof(i))!=ERROR_SUCCESS) return fail("SetValueEx"); } for (i=0; i<26; i++) { nsize = 2; risize = sizeof(ri); if (RegEnumValue(regorder,i,name,&nsize,NULL,&type,(BYTE*)&ri,&risize)!=ERROR_SUCCESS) return fail("EnumValue"); printf("%s = %d\n",name,ri); if (ri!=26-i) return fail("Comparison"); }
if (RegCloseKey(regorder)!=ERROR_SUCCESS) return fail("CloseKey");
if (RegDeleteKey(wine,"TestRegOrder")!=ERROR_SUCCESS) return fail("DeleteKey");
return 0; } //---------------------------------------------------------------------------