/*********************************************************************** * RegisterOCX (ADVPACK.@) * * Registers an OCX. * * PARAMS * hWnd [I] Handle to the window used for the display. * hInst [I] Instance of the process. * cmdline [I] Contains parameters in the order OCX,flags,param. * show [I] How the window should be shown. * * RETURNS * Success: S_OK. * Failure: E_FAIL. * * NOTES * OCX - Filename of the OCX to register. * flags - Controls the operation of RegisterOCX. * 'I' Call DllRegisterServer and DllInstall. * 'N' Only call DllInstall. * param - Command line passed to DllInstall. */ HRESULT WINAPI RegisterOCX(HWND hWnd, HINSTANCE hInst, LPCSTR cmdline, INT show) { LPWSTR ocx_filename, str_flags, param; LPWSTR cmdline_copy, cmdline_ptr; UNICODE_STRING cmdlineW; HRESULT hr = E_FAIL; HMODULE hm = NULL; DWORD size; TRACE("(%s)\n", debugstr_a(cmdline)); RtlCreateUnicodeStringFromAsciiz(&cmdlineW, cmdline); size = (lstrlenW(cmdlineW.Buffer) + 1) * sizeof(WCHAR); cmdline_copy = HeapAlloc(GetProcessHeap(), 0, size); cmdline_ptr = cmdline_copy; lstrcpyW(cmdline_copy, cmdlineW.Buffer); ocx_filename = get_parameter(&cmdline_ptr, ',', TRUE); if (!ocx_filename || !*ocx_filename) goto done; str_flags = get_parameter(&cmdline_ptr, ',', TRUE); param = get_parameter(&cmdline_ptr, ',', TRUE); hm = LoadLibraryExW(ocx_filename, NULL, LOAD_WITH_ALTERED_SEARCH_PATH); if (!hm) goto done; hr = do_ocx_reg(hm, TRUE, str_flags, param); done: FreeLibrary(hm); HeapFree(GetProcessHeap(), 0, cmdline_copy); RtlFreeUnicodeString(&cmdlineW); return hr; }
static HRESULT register_ocxs_callback(HINF hinf, PCWSTR field, const void *arg) { HMODULE hm; INFCONTEXT context; HRESULT hr = S_OK; BOOL ok = SetupFindFirstLineW(hinf, field, NULL, &context); for (; ok; ok = SetupFindNextLine(&context, &context)) { WCHAR buffer[MAX_INF_STRING_LENGTH]; /* get OCX filename */ if (!SetupGetStringFieldW(&context, 1, buffer, sizeof(buffer) / sizeof(WCHAR), NULL)) continue; hm = LoadLibraryExW(buffer, NULL, LOAD_WITH_ALTERED_SEARCH_PATH); if (hm) { if (do_ocx_reg(hm, TRUE, NULL, NULL) != S_OK) hr = E_FAIL; FreeLibrary(hm); } else hr = E_FAIL; if (FAILED(hr)) { /* FIXME: display a message box */ break; } } return hr; }