PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Pfad einer dll aus registry lesen


Elemental
2003-05-19, 13:28:30
Hallo Leute,
ich versuche gerade verzweifelt, den Pfad einer dll aus der registry zu lesen. Der Pfad steht im key "(Standard)", aber irgendwie kann man den nicht auslesen. Habs so versucht:

bool bTakePathFromRegistry = false;

// Look for special path into registry
CRegKey reg;
TCHAR szFilePath[200];
szFilePath[0] = _T('\0');

if (reg.Open(HKEY_CLASSES_ROOT, _T("CLSID\\{04E5C02B-4C56-47B8-ABFC-E89DCF81A881}\\InprocServer32")) == ERROR_SUCCESS)
{
DWORD len = sizeof(szFilePath) / sizeof (szFilePath[0]);
if (reg.QueryValue(szFilePath, _T("(Standard)"), &len) == ERROR_SUCCESS)
{
// Was able to read the value
if (_tcslen(szFilePath) > 0)
{
// only if is set to something
bTakePathFromRegistry = true;
}
// Remember to close it when done
reg.Close();
}
}


Wenn ich statt "(Standard)" "ThreadingModel" auslese funktioniert es auf diesem Weg aber wunderbar.
Kann mir hier jemand weiterhelfen?

Gruss
Elemental


edit:
Hab den entsprechenden registry-eintrag mal exportiert. Im file steht dann:

[HKEY_CLASSES_ROOT\CLSID\{04E5C02B-4C56-47B8-ABFC-E89DCF81A881}\InprocServer32]
@="Pfad\\Dateiname.dll"
"ThreadingModel"="Apartment"


Allerdings funktioniert es auch nicht, wenn ich statt "(Standard)" "@" in meinen Code da oben einsetze ???

Demirug
2003-05-19, 13:52:39
bool bTakePathFromRegistry = false;

// Look for special path into registry
CRegKey reg;
TCHAR szFilePath[200];
szFilePath[0] = _T('\0');

if (reg.Open(HKEY_CLASSES_ROOT, _T("CLSID\\{04E5C02B-4C56-47B8-ABFC-E89DCF81A881}\\InprocServer32")) == ERROR_SUCCESS)
{
DWORD len = sizeof(szFilePath) / sizeof (szFilePath[0]);
if (reg.QueryValue(szFilePath, NULL, &len) == ERROR_SUCCESS)
{
// Was able to read the value
if (_tcslen(szFilePath) > 0)
{
// only if is set to something
bTakePathFromRegistry = true;
}
// Remember to close it when done
reg.Close();
}
}

So müsste es gehen. Der "(Standard)" Eintrag im Regedit ist eigentlich der "Default" Eintrag und der hat keinen Namen deswegen wird beim Namen dann auch NULL benutzt.

Elemental
2003-05-19, 13:53:55
Geht leider auch mit NULL nicht :(

RegQueryValueEx liefert dann 234 zurück:

// MessageId: ERROR_MORE_DATA
//
// MessageText:
//
// More data is available.
//
#define ERROR_MORE_DATA 234L // dderror


Hier der entsprechende Code:
inline LONG CRegKey::QueryValue(LPTSTR szValue, LPCTSTR lpszValueName, DWORD* pdwCount)
{
ATLASSERT(pdwCount != NULL);
DWORD dwType = NULL;
LONG lRes = RegQueryValueEx(m_hKey, (LPTSTR)lpszValueName, NULL, &dwType,
(LPBYTE)szValue, pdwCount);
ATLASSERT((lRes!=ERROR_SUCCESS) || (dwType == REG_SZ) ||
(dwType == REG_MULTI_SZ) || (dwType == REG_EXPAND_SZ));
return lRes;
}

Übrigens gibst den gleichen return-Code, wenn ich einen leeren String mitgebe.

Elemental
2003-05-19, 14:20:15
Haha, Problem gelöst.

Mein TCHAR array war zu klein. Mit

bool bTakePathFromRegistry = false;

// Look for special path into registry
CRegKey reg;
TCHAR szFilePath[500];
szFilePath[0] = _T('\0');

if (reg.Open(HKEY_CLASSES_ROOT, _T("CLSID\\{04E5C02B-4C56-47B8-ABFC-E89DCF81A881}\\InprocServer32")) == ERROR_SUCCESS)
{
DWORD len = sizeof(szFilePath) / sizeof (szFilePath[0]);
if (reg.QueryValue(szFilePath, NULL, &len) == ERROR_SUCCESS)
{
// Was able to read the value
if (_tcslen(szFilePath) > 0)
{
// only if is set to something
bTakePathFromRegistry = true;
}
// Remember to close it when done
reg.Close();
}
}

funktionierts.

Danke Demirug!


Gruss
Elemental