SHCoCreateInstance is now documented (spotted by Francois Gouget).
Its first argument should be a Unicode string.

diff --git a/dlls/avifil32/api.c b/dlls/avifil32/api.c
index 8a96dab..668aedb 100644
--- a/dlls/avifil32/api.c
+++ b/dlls/avifil32/api.c
@@ -32,6 +32,7 @@
 
 #include "ole2.h"
 #include "shellapi.h"
+#include "shlobj.h"
 #include "vfw.h"
 #include "msacm.h"
 
@@ -42,11 +43,6 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(avifile);
 
-/***********************************************************************
- * copied from dlls/shell32/undocshell.h
- */
-HRESULT WINAPI SHCoCreateInstance(LPCSTR lpszClsid,REFCLSID rClsid,
-				  LPUNKNOWN pUnkOuter,REFIID riid,LPVOID *ppv);
 
 /***********************************************************************
  * for AVIBuildFilterW -- uses fixed size table
diff --git a/dlls/shell32/shell32.spec b/dlls/shell32/shell32.spec
index fd535f4..cfb47e5 100644
--- a/dlls/shell32/shell32.spec
+++ b/dlls/shell32/shell32.spec
@@ -95,7 +95,7 @@
   99 stdcall SetAppStartingCursor (long long)
  100 stdcall SHRestricted(long)
 
- 102 stdcall SHCoCreateInstance(ptr ptr long ptr ptr)
+ 102 stdcall SHCoCreateInstance(wstr ptr long ptr ptr)
  103 stdcall SignalFileOpen(long)
  104 stdcall FileMenu_DeleteAllItems(long)
  105 stdcall FileMenu_DrawItem(long ptr)
diff --git a/dlls/shell32/shellole.c b/dlls/shell32/shellole.c
index a743871..6ec6f8d 100644
--- a/dlls/shell32/shellole.c
+++ b/dlls/shell32/shellole.c
@@ -122,8 +122,8 @@
 /************************************************************************/
 
 LRESULT WINAPI SHCoCreateInstance(
-	LPCSTR aclsid,
-	REFCLSID clsid,
+	LPCWSTR aclsid,
+	const CLSID *clsid,
 	LPUNKNOWN pUnkOuter,
 	REFIID refiid,
 	LPVOID *ppv)
@@ -150,7 +150,7 @@
 	if (!clsid)
 	{
 	  if (!aclsid) return REGDB_E_CLASSNOTREG;
-	  SHCLSIDFromStringA(aclsid, &iid);
+	  SHCLSIDFromStringW(aclsid, &iid);
 	  myclsid = &iid;
 	}
 
@@ -279,7 +279,7 @@
         return CO_E_CLASSSTRING;
     return CLSIDFromString( buffer, id );
 }
-DWORD WINAPI SHCLSIDFromStringW (LPWSTR clsid, CLSID *id)
+DWORD WINAPI SHCLSIDFromStringW (LPCWSTR clsid, CLSID *id)
 {
 	TRACE("(%p(%s) %p)\n", clsid, debugstr_w(clsid), id);
 	return CLSIDFromString(clsid, id);
diff --git a/dlls/shell32/undocshell.h b/dlls/shell32/undocshell.h
index 69b6942..b38ad83 100644
--- a/dlls/shell32/undocshell.h
+++ b/dlls/shell32/undocshell.h
@@ -836,14 +836,7 @@
 	REFIID riidObject);
 
 DWORD WINAPI SHCLSIDFromStringA (LPCSTR clsid, CLSID *id);
-DWORD WINAPI SHCLSIDFromStringW (LPWSTR clsid, CLSID *id);
-
-HRESULT WINAPI SHCoCreateInstance(
-	LPCSTR lpszClsid,
-	REFCLSID rClsid,
-	LPUNKNOWN pUnkOuter,
-	REFIID riid,
-	LPVOID *ppv);
+DWORD WINAPI SHCLSIDFromStringW (LPCWSTR clsid, CLSID *id);
 
 void WINAPI SHFreeUnusedLibraries();
 
diff --git a/include/shlobj.h b/include/shlobj.h
index a880619..9c90852 100644
--- a/include/shlobj.h
+++ b/include/shlobj.h
@@ -33,6 +33,7 @@
 #include <shtypes.h>
 #include <shobjidl.h>
 
+HRESULT WINAPI SHCoCreateInstance(LPCWSTR,const CLSID*,LPUNKNOWN,REFIID,LPVOID*);
 
 BOOL WINAPI SHGetPathFromIDListA (LPCITEMIDLIST pidl,LPSTR pszPath);
 BOOL WINAPI SHGetPathFromIDListW (LPCITEMIDLIST pidl,LPWSTR pszPath);