ole32/tests: Tests for CLSIDFromProgID() and ProgIDFromCLSID(), regarding activation context.
This commit is contained in:
parent
5a34de7e10
commit
cf087d0eb7
|
@ -22,6 +22,7 @@
|
|||
#define CONST_VTABLE
|
||||
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include "windef.h"
|
||||
#include "winbase.h"
|
||||
|
@ -43,6 +44,11 @@ static HRESULT (WINAPI * pCoGetTreatAsClass)(REFCLSID clsidOld, LPCLSID pClsidNe
|
|||
static HRESULT (WINAPI * pCoGetContextToken)(ULONG_PTR *token);
|
||||
static LONG (WINAPI * pRegOverridePredefKey)(HKEY key, HKEY override);
|
||||
|
||||
static BOOL (WINAPI *pActivateActCtx)(HANDLE,ULONG_PTR*);
|
||||
static HANDLE (WINAPI *pCreateActCtxW)(PCACTCTXW);
|
||||
static BOOL (WINAPI *pDeactivateActCtx)(DWORD,ULONG_PTR);
|
||||
static void (WINAPI *pReleaseActCtx)(HANDLE);
|
||||
|
||||
#define ok_ole_success(hr, func) ok(hr == S_OK, func " failed with error 0x%08x\n", hr)
|
||||
#define ok_more_than_one_lock() ok(cLocks > 0, "Number of locks should be > 0, but actually is %d\n", cLocks)
|
||||
#define ok_no_locks() ok(cLocks == 0, "Number of locks should be 0, but actually is %d\n", cLocks)
|
||||
|
@ -56,6 +62,7 @@ static WCHAR wszCLSID_StdFont[] =
|
|||
'{','0','b','e','3','5','2','0','3','-','8','f','9','1','-','1','1','c','e','-',
|
||||
'9','d','e','3','-','0','0','a','a','0','0','4','b','b','8','5','1','}',0
|
||||
};
|
||||
static const WCHAR progidW[] = {'P','r','o','g','I','d','.','P','r','o','g','I','d',0};
|
||||
|
||||
static const IID IID_IWineTest =
|
||||
{
|
||||
|
@ -71,6 +78,18 @@ static const CLSID CLSID_WineOOPTest = {
|
|||
{0xa1, 0xa2, 0x5d, 0x5a, 0x36, 0x54, 0xd3, 0xbd}
|
||||
}; /* 5201163f-8164-4fd0-a1a2-5d5a3654d3bd */
|
||||
|
||||
static const char *debugstr_guid(REFIID riid)
|
||||
{
|
||||
static char buf[50];
|
||||
|
||||
sprintf(buf, "{%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}",
|
||||
riid->Data1, riid->Data2, riid->Data3, riid->Data4[0],
|
||||
riid->Data4[1], riid->Data4[2], riid->Data4[3], riid->Data4[4],
|
||||
riid->Data4[5], riid->Data4[6], riid->Data4[7]);
|
||||
|
||||
return buf;
|
||||
}
|
||||
|
||||
static LONG cLocks;
|
||||
|
||||
static void LockModule(void)
|
||||
|
@ -143,10 +162,87 @@ static const IClassFactoryVtbl TestClassFactory_Vtbl =
|
|||
|
||||
static IClassFactory Test_ClassFactory = { &TestClassFactory_Vtbl };
|
||||
|
||||
static WCHAR manifest_path[MAX_PATH];
|
||||
|
||||
static BOOL create_manifest_file(const char *filename, const char *manifest)
|
||||
{
|
||||
int manifest_len;
|
||||
DWORD size;
|
||||
HANDLE file;
|
||||
WCHAR path[MAX_PATH];
|
||||
|
||||
MultiByteToWideChar( CP_ACP, 0, filename, -1, path, MAX_PATH );
|
||||
GetFullPathNameW(path, sizeof(manifest_path)/sizeof(WCHAR), manifest_path, NULL);
|
||||
|
||||
manifest_len = strlen(manifest);
|
||||
file = CreateFileW(path, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,
|
||||
FILE_ATTRIBUTE_NORMAL, NULL);
|
||||
ok(file != INVALID_HANDLE_VALUE, "CreateFile failed: %u\n", GetLastError());
|
||||
if(file == INVALID_HANDLE_VALUE)
|
||||
return FALSE;
|
||||
WriteFile(file, manifest, manifest_len, &size, NULL);
|
||||
CloseHandle(file);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static HANDLE activate_context(const char *manifest, ULONG_PTR *cookie)
|
||||
{
|
||||
WCHAR path[MAX_PATH];
|
||||
ACTCTXW actctx;
|
||||
HANDLE handle;
|
||||
BOOL ret;
|
||||
|
||||
if (!pCreateActCtxW) return NULL;
|
||||
|
||||
create_manifest_file("file.manifest", manifest);
|
||||
|
||||
MultiByteToWideChar( CP_ACP, 0, "file.manifest", -1, path, MAX_PATH );
|
||||
memset(&actctx, 0, sizeof(ACTCTXW));
|
||||
actctx.cbSize = sizeof(ACTCTXW);
|
||||
actctx.lpSource = path;
|
||||
|
||||
handle = pCreateActCtxW(&actctx);
|
||||
ok(handle != INVALID_HANDLE_VALUE, "handle == INVALID_HANDLE_VALUE, error %u\n", GetLastError());
|
||||
|
||||
ok(actctx.cbSize == sizeof(ACTCTXW), "actctx.cbSize=%d\n", actctx.cbSize);
|
||||
ok(actctx.dwFlags == 0, "actctx.dwFlags=%d\n", actctx.dwFlags);
|
||||
ok(actctx.lpSource == path, "actctx.lpSource=%p\n", actctx.lpSource);
|
||||
ok(actctx.wProcessorArchitecture == 0, "actctx.wProcessorArchitecture=%d\n", actctx.wProcessorArchitecture);
|
||||
ok(actctx.wLangId == 0, "actctx.wLangId=%d\n", actctx.wLangId);
|
||||
ok(actctx.lpAssemblyDirectory == NULL, "actctx.lpAssemblyDirectory=%p\n", actctx.lpAssemblyDirectory);
|
||||
ok(actctx.lpResourceName == NULL, "actctx.lpResourceName=%p\n", actctx.lpResourceName);
|
||||
ok(actctx.lpApplicationName == NULL, "actctx.lpApplicationName=%p\n", actctx.lpApplicationName);
|
||||
ok(actctx.hModule == NULL, "actctx.hModule=%p\n", actctx.hModule);
|
||||
|
||||
DeleteFileA("file.manifest");
|
||||
|
||||
ret = pActivateActCtx(handle, cookie);
|
||||
ok(ret, "ActivateActCtx failed: %u\n", GetLastError());
|
||||
|
||||
return handle;
|
||||
}
|
||||
|
||||
static const char actctx_manifest[] =
|
||||
"<assembly xmlns=\"urn:schemas-microsoft-com:asm.v1\" manifestVersion=\"1.0\">"
|
||||
"<assemblyIdentity version=\"1.2.3.4\" name=\"Wine.Test\" type=\"win32\""
|
||||
" publicKeyToken=\"6595b6414666f1df\" />"
|
||||
"<file name=\"testlib.dll\">"
|
||||
" <comClass description=\"Test com class\""
|
||||
" clsid=\"{12345678-1234-1234-1234-56789abcdef0}\""
|
||||
" progid=\"ProgId.ProgId\""
|
||||
" />"
|
||||
"</file>"
|
||||
"</assembly>";
|
||||
|
||||
static void test_ProgIDFromCLSID(void)
|
||||
{
|
||||
ULONG_PTR cookie = 0;
|
||||
LPWSTR progid;
|
||||
HRESULT hr = ProgIDFromCLSID(&CLSID_StdFont, &progid);
|
||||
HANDLE handle;
|
||||
HRESULT hr;
|
||||
|
||||
hr = ProgIDFromCLSID(&CLSID_StdFont, &progid);
|
||||
ok(hr == S_OK, "ProgIDFromCLSID failed with error 0x%08x\n", hr);
|
||||
if (hr == S_OK)
|
||||
{
|
||||
|
@ -161,10 +257,27 @@ static void test_ProgIDFromCLSID(void)
|
|||
|
||||
hr = ProgIDFromCLSID(&CLSID_StdFont, NULL);
|
||||
ok(hr == E_INVALIDARG, "ProgIDFromCLSID should return E_INVALIDARG instead of 0x%08x\n", hr);
|
||||
|
||||
if ((handle = activate_context(actctx_manifest, &cookie)))
|
||||
{
|
||||
hr = ProgIDFromCLSID(&CLSID_non_existent, &progid);
|
||||
todo_wine
|
||||
ok(hr == S_OK, "got 0x%08x\n", hr);
|
||||
if (hr == S_OK)
|
||||
{
|
||||
ok(!lstrcmpiW(progid, progidW), "got %s\n", wine_dbgstr_w(progid));
|
||||
CoTaskMemFree(progid);
|
||||
}
|
||||
|
||||
pDeactivateActCtx(0, cookie);
|
||||
pReleaseActCtx(handle);
|
||||
}
|
||||
}
|
||||
|
||||
static void test_CLSIDFromProgID(void)
|
||||
{
|
||||
ULONG_PTR cookie = 0;
|
||||
HANDLE handle;
|
||||
CLSID clsid;
|
||||
HRESULT hr = CLSIDFromProgID(stdfont, &clsid);
|
||||
ok(hr == S_OK, "CLSIDFromProgID failed with error 0x%08x\n", hr);
|
||||
|
@ -186,6 +299,27 @@ static void test_CLSIDFromProgID(void)
|
|||
hr = CLSIDFromProgID(wszNonExistent, &clsid);
|
||||
ok(hr == CO_E_CLASSSTRING, "CLSIDFromProgID on nonexistent ProgID should have returned CO_E_CLASSSTRING instead of 0x%08x\n", hr);
|
||||
ok(IsEqualCLSID(&clsid, &CLSID_NULL), "CLSIDFromProgID should have set clsid to all-zeros on failure\n");
|
||||
|
||||
/* fails without proper context */
|
||||
memset(&clsid, 0xcc, sizeof(clsid));
|
||||
hr = CLSIDFromProgID(progidW, &clsid);
|
||||
ok(hr == CO_E_CLASSSTRING, "got 0x%08x\n", hr);
|
||||
ok(IsEqualCLSID(&clsid, &CLSID_NULL), "wrong clsid\n");
|
||||
|
||||
if ((handle = activate_context(actctx_manifest, &cookie)))
|
||||
{
|
||||
clsid = CLSID_NULL;
|
||||
hr = CLSIDFromProgID(progidW, &clsid);
|
||||
todo_wine
|
||||
ok(hr == S_OK, "got 0x%08x\n", hr);
|
||||
if (hr == S_OK)
|
||||
/* it returns generated CLSID here */
|
||||
ok(!IsEqualCLSID(&clsid, &CLSID_non_existent) && !IsEqualCLSID(&clsid, &CLSID_NULL),
|
||||
"got wrong clsid %s\n", debugstr_guid(&clsid));
|
||||
|
||||
pDeactivateActCtx(0, cookie);
|
||||
pReleaseActCtx(handle);
|
||||
}
|
||||
}
|
||||
|
||||
static void test_CLSIDFromString(void)
|
||||
|
@ -1568,16 +1702,30 @@ static void test_CoInitializeEx(void)
|
|||
OleUninitialize();
|
||||
}
|
||||
|
||||
START_TEST(compobj)
|
||||
static void init_funcs(void)
|
||||
{
|
||||
HMODULE hOle32 = GetModuleHandle("ole32");
|
||||
HMODULE hAdvapi32 = GetModuleHandle("advapi32");
|
||||
HMODULE hOle32 = GetModuleHandleA("ole32");
|
||||
HMODULE hAdvapi32 = GetModuleHandleA("advapi32");
|
||||
HMODULE hkernel32 = GetModuleHandleA("kernel32");
|
||||
|
||||
pCoGetObjectContext = (void*)GetProcAddress(hOle32, "CoGetObjectContext");
|
||||
pCoSwitchCallContext = (void*)GetProcAddress(hOle32, "CoSwitchCallContext");
|
||||
pCoGetTreatAsClass = (void*)GetProcAddress(hOle32,"CoGetTreatAsClass");
|
||||
pCoGetContextToken = (void*)GetProcAddress(hOle32, "CoGetContextToken");
|
||||
pRegOverridePredefKey = (void*)GetProcAddress(hAdvapi32, "RegOverridePredefKey");
|
||||
if (!(pCoInitializeEx = (void*)GetProcAddress(hOle32, "CoInitializeEx")))
|
||||
pCoInitializeEx = (void*)GetProcAddress(hOle32, "CoInitializeEx");
|
||||
|
||||
pActivateActCtx = (void*)GetProcAddress(hkernel32, "ActivateActCtx");
|
||||
pCreateActCtxW = (void*)GetProcAddress(hkernel32, "CreateActCtxW");
|
||||
pDeactivateActCtx = (void*)GetProcAddress(hkernel32, "DeactivateActCtx");
|
||||
pReleaseActCtx = (void*)GetProcAddress(hkernel32, "ReleaseActCtx");
|
||||
}
|
||||
|
||||
START_TEST(compobj)
|
||||
{
|
||||
init_funcs();
|
||||
|
||||
if (!pCoInitializeEx)
|
||||
{
|
||||
trace("You need DCOM95 installed to run this test\n");
|
||||
return;
|
||||
|
|
Loading…
Reference in New Issue