I'll let others comment on implementation part. Here are my remarks on the test part. On 07/14/2015 05:07 PM, Jonas Kümmerlin wrote:
+HRESULT (WINAPI *pSetCurrentProcessExplicitAppUserModelID)(const WCHAR *id); +HRESULT (WINAPI *pGetCurrentProcessExplicitAppUserModelID)(WCHAR **id); you can make them static as in other test files
+#define RESOLVE(hDll, proc) p##proc = (void*)GetProcAddress(hDll, #proc) + +static void test_process_aum_id(void) +{ <snip> + + hShell32 = GetModuleHandleA("shell32.dll"); + + RESOLVE(hShell32, SetCurrentProcessExplicitAppUserModelID); + RESOLVE(hShell32, GetCurrentProcessExplicitAppUserModelID); + + if (!pGetCurrentProcessExplicitAppUserModelID + || !pSetCurrentProcessExplicitAppUserModelID) + { + win_skip("SetCurrentProcessExplicitAppUserModelID is not available"); + return; + } You can move that initialization part to an init method (see tests/shellole.c), defining RESOLVE there and undef'ining it at the end of the init method or doind that in START_TEST block (like tests/appbar.c).
Do you plan on adding other test_* functions ?
+ /* MSDN claims the maximum length to be 128 chars, but in reality, + it is 127 chars + terminating NUL byte */ prove/test it
+ WCHAR test_id[] = { + 'W','i','n','e','.','T','e','s','t','.','A','a','a','a','a','a', + 'a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a', + 'a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a', + 'a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a', + 'a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a', + 'a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a', + 'a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a', + 'a','a','a','a','a','a','a','a','a','a','a','a','a','a','a', 0 }; If format is not important, a for loop can make it (so that you can test different lengths)
+ /* Receiving it without setting will fail with an unspecified error code */ + hr = pGetCurrentProcessExplicitAppUserModelID(&received); + ok(FAILED(hr), "receiving the AppUserModelID succeeded where it shouldn't\n"); + ok(received == NULL, "AppUserModelID '%s' has been returned even though none was set\n", + wine_dbgstr_w(received)); What do you mean by unspecified? Do you refer to MSDN? Is error code constant but not in the SDK headers?
+ if (received) + { <snip> + ok(length == test_id_length, "Expected id with length 127, got %d\n", length); Text is not what you're testing
Does Get* crash with NULL pointer? Same for Set*. What does happen when setting twice ? Error ? Get* retrives the latest ?