diff --git a/dlls/dmscript/Makefile.in b/dlls/dmscript/Makefile.in
index b3302ae..7d17f22 100644
--- a/dlls/dmscript/Makefile.in
+++ b/dlls/dmscript/Makefile.in
@@ -3,10 +3,11 @@
 
 C_SRCS = \
 	dmscript_main.c \
-	regsvr.c \
 	script.c \
 	scripttrack.c
 
-RC_SRCS = version.rc
+IDL_R_SRCS = dmscript.idl
+
+RC_SRCS = rsrc.rc
 
 @MAKE_DLL_RULES@
diff --git a/dlls/dmscript/dmscript.idl b/dlls/dmscript/dmscript.idl
new file mode 100644
index 0000000..7f7decd
--- /dev/null
+++ b/dlls/dmscript/dmscript.idl
@@ -0,0 +1,108 @@
+/*
+ * COM Classes for dmscript
+ *
+ * Copyright 2010 Alexandre Julliard
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+[
+    helpstring("DirectMusic Script AutoImp Segment"),
+    threading(both),
+    progid("Microsoft.DirectMusicScriptAutoImpSegment.1"),
+    vi_progid("Microsoft.DirectMusicScriptAutoImpSegment"),
+    uuid(4062c116-0270-11d3-8bcb-00600893b1b6)
+]
+coclass DirectMusicScriptAutoImpSegment { interface IDirectMusicScriptAutoImpSegment; }
+
+[
+    threading(both),
+    progid("Microsoft.DirectMusicScriptTrack.1"),
+    vi_progid("Microsoft.DirectMusicScriptTrack"),
+    uuid(4108fa85-3586-11d3-8bd7-00600893b1b6)
+]
+coclass DirectMusicScriptTrack { interface IDirectMusicScriptTrack; }
+
+[
+    helpstring("DirectMusic Script Object"),
+    threading(both),
+    progid("Microsoft.DirectMusicScript.1"),
+    vi_progid("Microsoft.DirectMusicScript"),
+    uuid(810b5013-e88d-11d2-8bc1-00600893b1b6)
+]
+coclass DirectMusicScript { interface IDirectMusicScript; }
+
+[
+    helpstring("DirectMusic Script AutoImp Performance"),
+    threading(both),
+    progid("Microsoft.DirectMusicScriptAutoImpPerformance.1"),
+    vi_progid("Microsoft.DirectMusicScriptAutoImpPerformance"),
+    uuid(a861c6e2-fcfc-11d2-8bc9-00600893b1b6)
+]
+coclass DirectMusicScriptAutoImpPerformance { interface IDirectMusicScriptAutoImpPerformance; }
+
+[
+    helpstring("DirectMusic Script Source Code Loader"),
+    threading(both),
+    progid("Microsoft.DirectMusicScripSourceCodeLoader.1"), /* sic */
+    vi_progid("Microsoft.DirectMusicScripSourceCodeLoader"),
+    uuid(c70eb77f-efd4-4678-a27b-bf1648f30d04)
+]
+coclass DirectMusicScriptSourceCodeLoader { interface IDirectMusicScriptSourceCodeLoader; }
+
+[
+    helpstring("DirectMusic Script AutoImp SegmentState"),
+    threading(both),
+    progid("Microsoft.DirectMusicScriptAutoImpSegmentState.1"),
+    vi_progid("Microsoft.DirectMusicScriptAutoImpSegmentState"),
+    uuid(ebf2320a-2502-11d3-8bd1-00600893b1b6)
+]
+coclass DirectMusicScriptAutoImpSegmentState { interface IDirectMusicScriptAutoImpSegmentState; }
+
+[
+    helpstring("DirectMusic Script AutoImp AudioPathConfig"),
+    threading(both),
+    progid("Microsoft.DirectMusicScriptAutoImpAudioPathConfig.1"),
+    vi_progid("Microsoft.DirectMusicScriptAutoImpAudioPathConfig"),
+    uuid(1cebde3e-6b91-484a-af48-5e4f4ed6b1e1)
+]
+coclass DirectMusicScriptAutoImpAudioPathConfig { interface IDirectMusicScriptAutoImpAudioPathConfig; }
+
+[
+    helpstring("DirectMusic Script AutoImp AudioPath"),
+    threading(both),
+    progid("Microsoft.DirectMusicScriptAutoImpAudioPath.1"),
+    vi_progid("Microsoft.DirectMusicScriptAutoImpAudioPath"),
+    uuid(2c5f9b72-7148-4d97-bfc9-68a0e076bebd)
+]
+coclass DirectMusicScriptAutoImpAudioPath { interface IDirectMusicScriptAutoImpAudioPath; }
+
+[
+    helpstring("DirectMusic Script AutoImp Song"),
+    threading(both),
+    progid("Microsoft.DirectMusicScriptAutoImpSong.1"),
+    vi_progid("Microsoft.DirectMusicScriptAutoImpSong"),
+    uuid(a16f1761-b6d8-42eb-8d57-4a44fedd3bd2)
+]
+coclass DirectMusicScriptAutoImpSong { interface IDirectMusicScriptAutoImpSong; }
+
+[
+    helpstring("DirectMusic Audio VB Script Language"),
+    threading(both),
+    progid("AudioVBScript.1"),
+    vi_progid("AudioVBScript"),
+    uuid(4ee17959-931e-49e4-a2c6-977ecf3628f3)
+]
+coclass AudioVBScript { interface IAudioVBScript; }
diff --git a/dlls/dmscript/dmscript.rgs b/dlls/dmscript/dmscript.rgs
new file mode 100644
index 0000000..05ba3a4
--- /dev/null
+++ b/dlls/dmscript/dmscript.rgs
@@ -0,0 +1,5 @@
+HKCR
+{
+    NoRemove AudioVBScript { DMScript }
+    NoRemove AudioVBScript.1 { DMScript }
+}
diff --git a/dlls/dmscript/dmscript_main.c b/dlls/dmscript/dmscript_main.c
index 6c382ed..da68ce1 100644
--- a/dlls/dmscript/dmscript_main.c
+++ b/dlls/dmscript/dmscript_main.c
@@ -21,9 +21,11 @@
 #include "wine/port.h"
 
 #include "dmscript_private.h"
+#include "rpcproxy.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(dmscript);
 
+static HINSTANCE instance;
 LONG DMSCRIPT_refCount = 0;
 
 typedef struct {
@@ -552,6 +554,7 @@
  */
 BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) {
 	if (fdwReason == DLL_PROCESS_ATTACH) {
+            instance = hinstDLL;
             DisableThreadLibraryCalls(hinstDLL);
 		/* FIXME: Initialisation */
 	} else if (fdwReason == DLL_PROCESS_DETACH) {
@@ -628,6 +631,22 @@
 }
 
 
+/***********************************************************************
+ *		DllRegisterServer (DMSCRIPT.@)
+ */
+HRESULT WINAPI DllRegisterServer(void)
+{
+    return __wine_register_resources( instance, NULL );
+}
+
+/***********************************************************************
+ *		DllUnregisterServer (DMSCRIPT.@)
+ */
+HRESULT WINAPI DllUnregisterServer(void)
+{
+    return __wine_unregister_resources( instance, NULL );
+}
+
 /******************************************************************
  *		Helper functions
  *
diff --git a/dlls/dmscript/regsvr.c b/dlls/dmscript/regsvr.c
deleted file mode 100644
index f60aea5..0000000
--- a/dlls/dmscript/regsvr.c
+++ /dev/null
@@ -1,541 +0,0 @@
-/*
- *	self-registerable dll functions for dmscript.dll
- *
- * Copyright (C) 2003 John K. Hohm
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
- */
-
-#include "dmscript_private.h"
-#include "wine/unicode.h"
-
-WINE_DEFAULT_DEBUG_CHANNEL(dmscript);
-
-/*
- * Near the bottom of this file are the exported DllRegisterServer and
- * DllUnregisterServer, which make all this worthwhile.
- */
-
-/***********************************************************************
- *		interface for self-registering
- */
-struct regsvr_interface {
-    IID const *iid;		/* NULL for end of list */
-    LPCSTR name;		/* can be NULL to omit */
-    IID const *base_iid;	/* can be NULL to omit */
-    int num_methods;		/* can be <0 to omit */
-    CLSID const *ps_clsid;	/* can be NULL to omit */
-    CLSID const *ps_clsid32;	/* can be NULL to omit */
-};
-
-static HRESULT register_interfaces(struct regsvr_interface const *list);
-static HRESULT unregister_interfaces(struct regsvr_interface const *list);
-
-struct regsvr_coclass {
-    CLSID const *clsid;		/* NULL for end of list */
-    LPCSTR name;		/* can be NULL to omit */
-    LPCSTR ips;			/* can be NULL to omit */
-    LPCSTR ips32;		/* can be NULL to omit */
-    LPCSTR ips32_tmodel;	/* can be NULL to omit */
-    LPCSTR progid;		/* can be NULL to omit */
-    LPCSTR viprogid;		/* can be NULL to omit */
-    LPCSTR progid_extra;	/* can be NULL to omit */
-};
-
-static HRESULT register_coclasses(struct regsvr_coclass const *list);
-static HRESULT unregister_coclasses(struct regsvr_coclass const *list);
-
-/***********************************************************************
- *		static string constants
- */
-static WCHAR const interface_keyname[10] = {
-    'I', 'n', 't', 'e', 'r', 'f', 'a', 'c', 'e', 0 };
-static WCHAR const base_ifa_keyname[14] = {
-    'B', 'a', 's', 'e', 'I', 'n', 't', 'e', 'r', 'f', 'a', 'c',
-    'e', 0 };
-static WCHAR const num_methods_keyname[11] = {
-    'N', 'u', 'm', 'M', 'e', 't', 'h', 'o', 'd', 's', 0 };
-static WCHAR const ps_clsid_keyname[15] = {
-    'P', 'r', 'o', 'x', 'y', 'S', 't', 'u', 'b', 'C', 'l', 's',
-    'i', 'd', 0 };
-static WCHAR const ps_clsid32_keyname[17] = {
-    'P', 'r', 'o', 'x', 'y', 'S', 't', 'u', 'b', 'C', 'l', 's',
-    'i', 'd', '3', '2', 0 };
-static WCHAR const clsid_keyname[6] = {
-    'C', 'L', 'S', 'I', 'D', 0 };
-static WCHAR const curver_keyname[7] = {
-    'C', 'u', 'r', 'V', 'e', 'r', 0 };
-static WCHAR const ips_keyname[13] = {
-    'I', 'n', 'P', 'r', 'o', 'c', 'S', 'e', 'r', 'v', 'e', 'r',
-    0 };
-static WCHAR const ips32_keyname[15] = {
-    'I', 'n', 'P', 'r', 'o', 'c', 'S', 'e', 'r', 'v', 'e', 'r',
-    '3', '2', 0 };
-static WCHAR const progid_keyname[7] = {
-    'P', 'r', 'o', 'g', 'I', 'D', 0 };
-static WCHAR const viprogid_keyname[25] = {
-    'V', 'e', 'r', 's', 'i', 'o', 'n', 'I', 'n', 'd', 'e', 'p',
-    'e', 'n', 'd', 'e', 'n', 't', 'P', 'r', 'o', 'g', 'I', 'D',
-    0 };
-static char const tmodel_valuename[] = "ThreadingModel";
-
-/***********************************************************************
- *		static helper functions
- */
-static LONG register_key_guid(HKEY base, WCHAR const *name, GUID const *guid);
-static LONG register_key_defvalueW(HKEY base, WCHAR const *name,
-				   WCHAR const *value);
-static LONG register_key_defvalueA(HKEY base, WCHAR const *name,
-				   char const *value);
-static LONG register_progid(WCHAR const *clsid,
-			    char const *progid, char const *curver_progid,
-			    char const *name, char const *extra);
-
-/***********************************************************************
- *		register_interfaces
- */
-static HRESULT register_interfaces(struct regsvr_interface const *list) {
-    LONG res = ERROR_SUCCESS;
-    HKEY interface_key;
-
-    res = RegCreateKeyExW(HKEY_CLASSES_ROOT, interface_keyname, 0, NULL, 0,
-			  KEY_READ | KEY_WRITE, NULL, &interface_key, NULL);
-    if (res != ERROR_SUCCESS) goto error_return;
-
-    for (; res == ERROR_SUCCESS && list->iid; ++list) {
-	WCHAR buf[39];
-	HKEY iid_key;
-
-	StringFromGUID2(list->iid, buf, 39);
-	res = RegCreateKeyExW(interface_key, buf, 0, NULL, 0,
-			      KEY_READ | KEY_WRITE, NULL, &iid_key, NULL);
-	if (res != ERROR_SUCCESS) goto error_close_interface_key;
-
-	if (list->name) {
-	    res = RegSetValueExA(iid_key, NULL, 0, REG_SZ,
-				 (CONST BYTE*)(list->name),
-				 strlen(list->name) + 1);
-	    if (res != ERROR_SUCCESS) goto error_close_iid_key;
-	}
-
-	if (list->base_iid) {
-	    res = register_key_guid(iid_key, base_ifa_keyname, list->base_iid);
-	    if (res != ERROR_SUCCESS) goto error_close_iid_key;
-	}
-
-	if (0 <= list->num_methods) {
-	    static WCHAR const fmt[3] = { '%', 'd', 0 };
-	    HKEY key;
-
-	    res = RegCreateKeyExW(iid_key, num_methods_keyname, 0, NULL, 0,
-				  KEY_READ | KEY_WRITE, NULL, &key, NULL);
-	    if (res != ERROR_SUCCESS) goto error_close_iid_key;
-
-	    sprintfW(buf, fmt, list->num_methods);
-	    res = RegSetValueExW(key, NULL, 0, REG_SZ,
-				 (CONST BYTE*)buf,
-				 (lstrlenW(buf) + 1) * sizeof(WCHAR));
-	    RegCloseKey(key);
-
-	    if (res != ERROR_SUCCESS) goto error_close_iid_key;
-	}
-
-	if (list->ps_clsid) {
-	    res = register_key_guid(iid_key, ps_clsid_keyname, list->ps_clsid);
-	    if (res != ERROR_SUCCESS) goto error_close_iid_key;
-	}
-
-	if (list->ps_clsid32) {
-	    res = register_key_guid(iid_key, ps_clsid32_keyname, list->ps_clsid32);
-	    if (res != ERROR_SUCCESS) goto error_close_iid_key;
-	}
-
-    error_close_iid_key:
-	RegCloseKey(iid_key);
-    }
-
-error_close_interface_key:
-    RegCloseKey(interface_key);
-error_return:
-    return res != ERROR_SUCCESS ? HRESULT_FROM_WIN32(res) : S_OK;
-}
-
-/***********************************************************************
- *		unregister_interfaces
- */
-static HRESULT unregister_interfaces(struct regsvr_interface const *list) {
-    LONG res = ERROR_SUCCESS;
-    HKEY interface_key;
-
-    res = RegOpenKeyExW(HKEY_CLASSES_ROOT, interface_keyname, 0,
-			KEY_READ | KEY_WRITE, &interface_key);
-    if (res == ERROR_FILE_NOT_FOUND) return S_OK;
-    if (res != ERROR_SUCCESS) goto error_return;
-
-    for (; res == ERROR_SUCCESS && list->iid; ++list) {
-	WCHAR buf[39];
-
-	StringFromGUID2(list->iid, buf, 39);
-	res = RegDeleteTreeW(interface_key, buf);
-	if (res == ERROR_FILE_NOT_FOUND) res = ERROR_SUCCESS;
-    }
-
-    RegCloseKey(interface_key);
-error_return:
-    return res != ERROR_SUCCESS ? HRESULT_FROM_WIN32(res) : S_OK;
-}
-
-/***********************************************************************
- *		register_coclasses
- */
-static HRESULT register_coclasses(struct regsvr_coclass const *list) {
-    LONG res = ERROR_SUCCESS;
-    HKEY coclass_key;
-
-    res = RegCreateKeyExW(HKEY_CLASSES_ROOT, clsid_keyname, 0, NULL, 0,
-			  KEY_READ | KEY_WRITE, NULL, &coclass_key, NULL);
-    if (res != ERROR_SUCCESS) goto error_return;
-
-    for (; res == ERROR_SUCCESS && list->clsid; ++list) {
-	WCHAR buf[39];
-	HKEY clsid_key;
-
-	StringFromGUID2(list->clsid, buf, 39);
-	res = RegCreateKeyExW(coclass_key, buf, 0, NULL, 0,
-			      KEY_READ | KEY_WRITE, NULL, &clsid_key, NULL);
-	if (res != ERROR_SUCCESS) goto error_close_coclass_key;
-
-	if (list->name) {
-	    res = RegSetValueExA(clsid_key, NULL, 0, REG_SZ,
-				 (CONST BYTE*)(list->name),
-				 strlen(list->name) + 1);
-	    if (res != ERROR_SUCCESS) goto error_close_clsid_key;
-	}
-
-	if (list->ips) {
-	    res = register_key_defvalueA(clsid_key, ips_keyname, list->ips);
-	    if (res != ERROR_SUCCESS) goto error_close_clsid_key;
-	}
-
-	if (list->ips32) {
-	    HKEY ips32_key;
-
-	    res = RegCreateKeyExW(clsid_key, ips32_keyname, 0, NULL, 0,
-				  KEY_READ | KEY_WRITE, NULL,
-				  &ips32_key, NULL);
-	    if (res != ERROR_SUCCESS) goto error_close_clsid_key;
-
-	    res = RegSetValueExA(ips32_key, NULL, 0, REG_SZ,
-				 (CONST BYTE*)list->ips32,
-				 lstrlenA(list->ips32) + 1);
-	    if (res == ERROR_SUCCESS && list->ips32_tmodel)
-		res = RegSetValueExA(ips32_key, tmodel_valuename, 0, REG_SZ,
-				     (CONST BYTE*)list->ips32_tmodel,
-				     strlen(list->ips32_tmodel) + 1);
-	    RegCloseKey(ips32_key);
-	    if (res != ERROR_SUCCESS) goto error_close_clsid_key;
-	}
-
-	if (list->progid) {
-	    res = register_key_defvalueA(clsid_key, progid_keyname,
-					 list->progid);
-	    if (res != ERROR_SUCCESS) goto error_close_clsid_key;
-
-	    res = register_progid(buf, list->progid, NULL,
-				  list->name, list->progid_extra);
-	    if (res != ERROR_SUCCESS) goto error_close_clsid_key;
-	}
-
-	if (list->viprogid) {
-	    res = register_key_defvalueA(clsid_key, viprogid_keyname,
-					 list->viprogid);
-	    if (res != ERROR_SUCCESS) goto error_close_clsid_key;
-
-	    res = register_progid(buf, list->viprogid, list->progid,
-				  list->name, list->progid_extra);
-	    if (res != ERROR_SUCCESS) goto error_close_clsid_key;
-	}
-
-    error_close_clsid_key:
-	RegCloseKey(clsid_key);
-    }
-
-error_close_coclass_key:
-    RegCloseKey(coclass_key);
-error_return:
-    return res != ERROR_SUCCESS ? HRESULT_FROM_WIN32(res) : S_OK;
-}
-
-/***********************************************************************
- *		unregister_coclasses
- */
-static HRESULT unregister_coclasses(struct regsvr_coclass const *list) {
-    LONG res = ERROR_SUCCESS;
-    HKEY coclass_key;
-
-    res = RegOpenKeyExW(HKEY_CLASSES_ROOT, clsid_keyname, 0,
-			KEY_READ | KEY_WRITE, &coclass_key);
-    if (res == ERROR_FILE_NOT_FOUND) return S_OK;
-    if (res != ERROR_SUCCESS) goto error_return;
-
-    for (; res == ERROR_SUCCESS && list->clsid; ++list) {
-	WCHAR buf[39];
-
-	StringFromGUID2(list->clsid, buf, 39);
-	res = RegDeleteTreeW(coclass_key, buf);
-	if (res == ERROR_FILE_NOT_FOUND) res = ERROR_SUCCESS;
-	if (res != ERROR_SUCCESS) goto error_close_coclass_key;
-
-	if (list->progid) {
-	    res = RegDeleteTreeA(HKEY_CLASSES_ROOT, list->progid);
-	    if (res == ERROR_FILE_NOT_FOUND) res = ERROR_SUCCESS;
-	    if (res != ERROR_SUCCESS) goto error_close_coclass_key;
-	}
-
-	if (list->viprogid) {
-	    res = RegDeleteTreeA(HKEY_CLASSES_ROOT, list->viprogid);
-	    if (res == ERROR_FILE_NOT_FOUND) res = ERROR_SUCCESS;
-	    if (res != ERROR_SUCCESS) goto error_close_coclass_key;
-	}
-    }
-
-error_close_coclass_key:
-    RegCloseKey(coclass_key);
-error_return:
-    return res != ERROR_SUCCESS ? HRESULT_FROM_WIN32(res) : S_OK;
-}
-
-/***********************************************************************
- *		regsvr_key_guid
- */
-static LONG register_key_guid(HKEY base, WCHAR const *name, GUID const *guid) {
-    WCHAR buf[39];
-
-    StringFromGUID2(guid, buf, 39);
-    return register_key_defvalueW(base, name, buf);
-}
-
-/***********************************************************************
- *		regsvr_key_defvalueW
- */
-static LONG register_key_defvalueW(
-    HKEY base,
-    WCHAR const *name,
-    WCHAR const *value) {
-    LONG res;
-    HKEY key;
-
-    res = RegCreateKeyExW(base, name, 0, NULL, 0,
-			  KEY_READ | KEY_WRITE, NULL, &key, NULL);
-    if (res != ERROR_SUCCESS) return res;
-    res = RegSetValueExW(key, NULL, 0, REG_SZ, (CONST BYTE*)value,
-			 (lstrlenW(value) + 1) * sizeof(WCHAR));
-    RegCloseKey(key);
-    return res;
-}
-
-/***********************************************************************
- *		regsvr_key_defvalueA
- */
-static LONG register_key_defvalueA(
-    HKEY base,
-    WCHAR const *name,
-    char const *value) {
-    LONG res;
-    HKEY key;
-
-    res = RegCreateKeyExW(base, name, 0, NULL, 0,
-			  KEY_READ | KEY_WRITE, NULL, &key, NULL);
-    if (res != ERROR_SUCCESS) return res;
-    res = RegSetValueExA(key, NULL, 0, REG_SZ, (CONST BYTE*)value,
-			 lstrlenA(value) + 1);
-    RegCloseKey(key);
-    return res;
-}
-
-/***********************************************************************
- *		regsvr_progid
- */
-static LONG register_progid(
-    WCHAR const *clsid,
-    char const *progid,
-    char const *curver_progid,
-    char const *name,
-    char const *extra) {
-    LONG res;
-    HKEY progid_key;
-
-    res = RegCreateKeyExA(HKEY_CLASSES_ROOT, progid, 0,
-			  NULL, 0, KEY_READ | KEY_WRITE, NULL,
-			  &progid_key, NULL);
-    if (res != ERROR_SUCCESS) return res;
-
-    if (name) {
-	res = RegSetValueExA(progid_key, NULL, 0, REG_SZ,
-			     (CONST BYTE*)name, strlen(name) + 1);
-	if (res != ERROR_SUCCESS) goto error_close_progid_key;
-    }
-
-    if (clsid) {
-	res = register_key_defvalueW(progid_key, clsid_keyname, clsid);
-	if (res != ERROR_SUCCESS) goto error_close_progid_key;
-    }
-
-    if (curver_progid) {
-	res = register_key_defvalueA(progid_key, curver_keyname,
-				     curver_progid);
-	if (res != ERROR_SUCCESS) goto error_close_progid_key;
-    }
-
-    if (extra) {
-	HKEY extra_key;
-
-	res = RegCreateKeyExA(progid_key, extra, 0,
-			      NULL, 0, KEY_READ | KEY_WRITE, NULL,
-			      &extra_key, NULL);
-	if (res == ERROR_SUCCESS)
-	    RegCloseKey(extra_key);
-    }
-
-error_close_progid_key:
-    RegCloseKey(progid_key);
-    return res;
-}
-
-/***********************************************************************
- *		coclass list
- */
-static struct regsvr_coclass const coclass_list[] = {
-    {   &CLSID_DirectMusicScriptAutoImpSegment,
-    "DirectMusic Script AutoImp Segment",
-	NULL,
-	"dmscript.dll",
-	"Both",
-	"Microsoft.DirectMusicScriptAutoImpSegment.1",
-	"Microsoft.DirectMusicScriptAutoImpSegment"
-    },
-    {   &CLSID_DirectMusicScriptTrack,
-        "DirectMusicScriptTrack",
-	NULL,
-	"dmscript.dll",
-	"Both",
-	"Microsoft.DirectMusicScriptTrack.1",
-	"Microsoft.DirectMusicScriptTrack"
-    },
-    {   &CLSID_AudioVBScript,
-	"DirectMusic Audio VB Script Language",
-	NULL,
-	"dmscript.dll",
-	"Both",
-	"AudioVBScript.1",
-	"AudioVBScript",
-	"DMScript"
-    },
-    {   &CLSID_DirectMusicScript,
-    "DirectMusic Script Object",
-	NULL,
-	"dmscript.dll",
-	"Both",
-	"Microsoft.DirectMusicScript.1",
-	"Microsoft.DirectMusicScript"
-    },
-    {   &CLSID_DirectMusicScriptAutoImpPerformance,
-    "DirectMusic Script AutoImp Performance",
-	NULL,
-	"dmscript.dll",
-	"Both",
-	"Microsoft.DirectMusicScriptAutoImpPerformance.1",
-	"Microsoft.DirectMusicScriptAutoImpPerformance"
-    },
-    {   &CLSID_DirectMusicScriptSourceCodeLoader,
-        "DirectMusic Script Source Code Loader",
-	NULL,
-	"dmscript.dll",
-	"Both",
-	"Microsoft.DirectMusicScripSourceCodeLoader.1",	/* [sic] */
-	"Microsoft.DirectMusicScripSourceCodeLoader"
-    },
-    {   &CLSID_DirectMusicScriptAutoImpSegmentState,
-        "DirectMusic Script AutoImp SegmentState",
-	NULL,
-	"dmscript.dll",
-	"Both",
-	"Microsoft.DirectMusicScriptAutoImpSegmentState.1",
-	"Microsoft.DirectMusicScriptAutoImpSegmentState"
-    },
-    {   &CLSID_DirectMusicScriptAutoImpAudioPathConfig,
-        "DirectMusic Script AutoImp AudioPathConfig",
-	NULL,
-	"dmscript.dll",
-	"Both",
-	"Microsoft.DirectMusicScriptAutoImpAudioPathConfig.1",
-	"Microsoft.DirectMusicScriptAutoImpAudioPathConfig"
-    },
-    {   &CLSID_DirectMusicScriptAutoImpAudioPath,
-        "DirectMusic Script AutoImp AudioPath",
-	NULL,
-	"dmscript.dll",
-	"Both",
-	"Microsoft.DirectMusicScriptAutoImpAudioPath.1",
-	"Microsoft.DirectMusicScriptAutoImpAudioPath"
-    },
-    {   &CLSID_DirectMusicScriptAutoImpSong,
-        "DirectMusic Script AutoImp Song",
-	NULL,
-	"dmscript.dll",
-	"Both",
-	"Microsoft.DirectMusicScriptAutoImpSong.1",
-	"Microsoft.DirectMusicScriptAutoImpSong"
-    },
-    { NULL }			/* list terminator */
-};
-
-/***********************************************************************
- *		interface list
- */
-
-static struct regsvr_interface const interface_list[] = {
-    { NULL }			/* list terminator */
-};
-
-/***********************************************************************
- *		DllRegisterServer (DMSCRIPT.3)
- */
-HRESULT WINAPI DllRegisterServer(void)
-{
-    HRESULT hr;
-
-    TRACE("\n");
-
-    hr = register_coclasses(coclass_list);
-    if (SUCCEEDED(hr))
-	hr = register_interfaces(interface_list);
-    return hr;
-}
-
-/***********************************************************************
- *		DllUnregisterServer (DMSCRIPT.4)
- */
-HRESULT WINAPI DllUnregisterServer(void)
-{
-    HRESULT hr;
-
-    TRACE("\n");
-
-    hr = unregister_coclasses(coclass_list);
-    if (SUCCEEDED(hr))
-	hr = unregister_interfaces(interface_list);
-    return hr;
-}
diff --git a/dlls/dmscript/version.rc b/dlls/dmscript/rsrc.rc
similarity index 94%
rename from dlls/dmscript/version.rc
rename to dlls/dmscript/rsrc.rc
index 910630a..363bed5 100644
--- a/dlls/dmscript/version.rc
+++ b/dlls/dmscript/rsrc.rc
@@ -16,6 +16,9 @@
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
  */
 
+/* @makedep: dmscript.rgs */
+1 WINE_REGISTRY dmscript.rgs
+
 #define WINE_FILEDESCRIPTION_STR "Wine DirectMusic Scripting"
 #define WINE_FILENAME_STR "dmscript.dll"
 #define WINE_FILEVERSION 5,3,0,900
