diff --git a/dlls/atl/registrar.c b/dlls/atl/registrar.c
index 074ada2..943d4f6 100644
--- a/dlls/atl/registrar.c
+++ b/dlls/atl/registrar.c
@@ -422,7 +422,7 @@
 }
 
 static HRESULT resource_register(Registrar *This, LPCOLESTR resFileName,
-                        UINT nID, LPCOLESTR szType, BOOL do_register)
+                        LPCOLESTR szID, LPCOLESTR szType, BOOL do_register)
 {
     HINSTANCE hins;
     HRSRC src;
@@ -433,7 +433,7 @@
 
     hins = LoadLibraryExW(resFileName, NULL, LOAD_LIBRARY_AS_DATAFILE);
     if(hins) {
-        src = FindResourceW(hins, (LPWSTR)nID, szType);
+        src = FindResourceW(hins, szID, szType);
         if(src) {
             regstra = (LPSTR)LoadResource(hins, src);
             reslen = SizeofResource(hins, src);
@@ -446,11 +446,11 @@
                 hres = string_register(This, regstrw, do_register);
 
                 HeapFree(GetProcessHeap(), 0, regstrw);
-                HeapFree(GetProcessHeap(), 0, regstra);
             }else {
                 WARN("could not load resource\n");
                 hres = HRESULT_FROM_WIN32(GetLastError());
             }
+            HeapFree(GetProcessHeap(), 0, regstra);
         }else {
             WARN("Could not find source\n");
             hres = HRESULT_FROM_WIN32(GetLastError());
@@ -464,6 +464,43 @@
     return hres;
 }
 
+static HRESULT file_register(Registrar *This, LPCOLESTR fileName, BOOL do_register)
+{
+    HANDLE file;
+    DWORD filelen, len;
+    LPWSTR regstrw;
+    LPSTR regstra;
+    LRESULT lres;
+    HRESULT hres;
+
+    file = CreateFileW(fileName, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_READONLY, NULL);
+    if(file) {
+        filelen = GetFileSize(file, NULL);
+        regstra = HeapAlloc(GetProcessHeap(), 0, filelen);
+        lres = ReadFile(file, regstra, filelen, NULL, NULL);
+        if(lres == ERROR_SUCCESS) {
+            len = MultiByteToWideChar(CP_ACP, 0, regstra, filelen, NULL, 0)+1;
+            regstrw = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, len*sizeof(WCHAR));
+            MultiByteToWideChar(CP_ACP, 0, regstra, filelen, regstrw, -1);
+            regstrw[len-1] = '\0';
+            
+            hres = string_register(This, regstrw, do_register);
+
+            HeapFree(GetProcessHeap(), 0, regstrw);
+        }else {
+            WARN("Failed to read faile\n");
+            hres = HRESULT_FROM_WIN32(lres);
+        }
+        HeapFree(GetProcessHeap(), 0, regstra);
+        CloseHandle(file);
+    }else {
+        WARN("Could not open file\n");
+        hres = HRESULT_FROM_WIN32(GetLastError());
+    }
+
+    return hres;
+}
+
 static HRESULT WINAPI Registrar_QueryInterface(IRegistrar *iface, REFIID riid, void **ppvObject)
 {
     TRACE("(%p)->(%s %p\n", iface, debugstr_guid(riid), ppvObject);
@@ -549,30 +586,30 @@
                 LPCOLESTR szID, LPCOLESTR szType)
 {
     Registrar *This = (Registrar*)iface;
-    FIXME("(%p)->(%s %s %s)\n", This, debugstr_w(resFileName), debugstr_w(szID), debugstr_w(szType));
-    return E_NOTIMPL;
+    TRACE("(%p)->(%s %s %s)\n", This, debugstr_w(resFileName), debugstr_w(szID), debugstr_w(szType));
+    return resource_register(This, resFileName, szID, szType, TRUE);
 }
 
 static HRESULT WINAPI Registrar_ResourceUnregisterSz(IRegistrar* iface, LPCOLESTR resFileName,
                 LPCOLESTR szID, LPCOLESTR szType)
 {
     Registrar *This = (Registrar*)iface;
-    FIXME("(%p)->(%s %s %s)\n", This, debugstr_w(resFileName), debugstr_w(szID), debugstr_w(szType));
-    return E_NOTIMPL;
+    TRACE("(%p)->(%s %s %s)\n", This, debugstr_w(resFileName), debugstr_w(szID), debugstr_w(szType));
+    return resource_register(This, resFileName, szID, szType, FALSE);
 }
 
 static HRESULT WINAPI Registrar_FileRegister(IRegistrar* iface, LPCOLESTR fileName)
 {
     Registrar *This = (Registrar*)iface;
-    FIXME("(%p)->(%s)\n", This, debugstr_w(fileName));
-    return E_NOTIMPL;
+    TRACE("(%p)->(%s)\n", This, debugstr_w(fileName));
+    return file_register(This, fileName, TRUE);
 }
 
 static HRESULT WINAPI Registrar_FileUnregister(IRegistrar* iface, LPCOLESTR fileName)
 {
     Registrar *This = (Registrar*)iface;
     FIXME("(%p)->(%s)\n", This, debugstr_w(fileName));
-    return E_NOTIMPL;
+    return file_register(This, fileName, FALSE);
 }
 
 static HRESULT WINAPI Registrar_StringRegister(IRegistrar* iface, LPCOLESTR data)
@@ -594,7 +631,7 @@
 {
     Registrar *This = (Registrar*)iface;
     TRACE("(%p)->(%s %d %s)\n", iface, debugstr_w(resFileName), nID, debugstr_w(szType));
-    return resource_register(This, resFileName, nID, szType, TRUE);
+    return resource_register(This, resFileName, (LPOLESTR)nID, szType, TRUE);
 }
 
 static HRESULT WINAPI Registrar_ResourceUnregister(IRegistrar* iface, LPCOLESTR resFileName,
@@ -602,7 +639,7 @@
 {
     Registrar *This = (Registrar*)iface;
     TRACE("(%p)->(%s %d %s)\n", This, debugstr_w(resFileName), nID, debugstr_w(szType));
-    return resource_register(This, resFileName, nID, szType, FALSE);
+    return resource_register(This, resFileName, (LPOLESTR)nID, szType, FALSE);
 }
 
 static IRegistrarVtbl RegistrarVtbl = {
