You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
108 lines
2.3 KiB
108 lines
2.3 KiB
|
|
#include "stdafx.h"
|
|
#include "setupapi.h"
|
|
#include "ole2.h"
|
|
|
|
|
|
typedef HRESULT (CALLBACK *HCRET)(void);
|
|
|
|
//
|
|
// This function registers an OLE control
|
|
//
|
|
DWORD RegisterOLEControl(LPCTSTR lpszOcxFile, BOOL fAction)
|
|
{
|
|
HINSTANCE hDll = NULL;
|
|
HCRET hProc = NULL;
|
|
DWORD dwErr = NO_ERROR;
|
|
|
|
CoInitialize(NULL);
|
|
if (GetFileAttributes(lpszOcxFile) != 0xFFFFFFFF)
|
|
{
|
|
hDll = LoadLibraryEx(lpszOcxFile, NULL, LOAD_WITH_ALTERED_SEARCH_PATH );
|
|
if (hDll)
|
|
{
|
|
if (fAction)
|
|
hProc = (HCRET)GetProcAddress(hDll, "DllRegisterServer");
|
|
else
|
|
hProc = (HCRET)GetProcAddress(hDll, "DllUnregisterServer");
|
|
|
|
if (hProc)
|
|
dwErr = (*hProc)();
|
|
else
|
|
dwErr = GetLastError();
|
|
|
|
FreeLibrary(hDll);
|
|
}
|
|
else
|
|
{
|
|
dwErr = GetLastError();
|
|
}
|
|
}
|
|
CoUninitialize();
|
|
|
|
return(dwErr);
|
|
}
|
|
|
|
|
|
//
|
|
// This function registers all OLE controls from a given INF section
|
|
//
|
|
DWORD RegisterOLEControlsFromInfSection(HINF hFile, LPCTSTR szSectionName, BOOL fRegister)
|
|
{
|
|
LPTSTR szLine;
|
|
DWORD dwLineLen = 0;
|
|
DWORD dwRequiredSize;
|
|
DWORD dwErr = NO_ERROR;
|
|
BOOL b = TRUE;
|
|
TCHAR szPath[MAX_PATH];
|
|
|
|
INFCONTEXT Context;
|
|
|
|
if (!SetupFindFirstLine(hFile, szSectionName, NULL, &Context))
|
|
return(GetLastError());
|
|
|
|
if (szLine = (LPTSTR)calloc(1024, sizeof(TCHAR)))
|
|
dwLineLen = 1024;
|
|
else
|
|
return(GetLastError());
|
|
|
|
while (b)
|
|
{
|
|
b = SetupGetLineText(&Context, NULL, NULL,
|
|
NULL, NULL, 0, &dwRequiredSize);
|
|
if (dwRequiredSize > dwLineLen)
|
|
{
|
|
free(szLine);
|
|
if (szLine = (LPTSTR)calloc(dwRequiredSize, sizeof(TCHAR)))
|
|
dwLineLen = dwRequiredSize;
|
|
else
|
|
return(GetLastError());
|
|
}
|
|
|
|
if (SetupGetLineText(&Context, NULL, NULL,
|
|
NULL, szLine, dwRequiredSize, NULL) == FALSE)
|
|
{
|
|
free(szLine);
|
|
return(GetLastError());
|
|
}
|
|
|
|
// Expand the line to a fully-qualified path
|
|
if (ExpandEnvironmentStrings(szLine, szPath, MAX_PATH) < MAX_PATH)
|
|
{
|
|
// Call function to register OLE control
|
|
RegisterOLEControl(szPath, fRegister);
|
|
}
|
|
else
|
|
{
|
|
dwErr = ERROR_MORE_DATA;
|
|
break;
|
|
}
|
|
|
|
b = SetupFindNextLine(&Context, &Context);
|
|
}
|
|
|
|
if (szLine)
|
|
free(szLine);
|
|
|
|
return(dwErr);
|
|
}
|