by mayberg » Sun Aug 08, 2010 7:12 am
I have the same problem. If MediaMonkey is not running yet, I can create a new instance by calling "new SongsDB.SDBApplication();" and everything works fine. But if Media Monkey is already running, I cannot connect to the COM-Server. There seems to be no way to connect to a running instance.
Some C# code that demonstrates the problem:
Code: Select all
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
namespace Test
{
class Program
{
static void Main(string[] args)
{
ConnectToMediaMonkeyViaMarshalGetActiveObject();
ConnectToMediaMonkeyViaNativeCall();
ConnectOrCreateMediaMonkey();
}
public static void ConnectOrCreateMediaMonkey()
{
try
{
Console.Out.WriteLine("Creating MediaMonkey COM Appliation Object...");
SongsDB.SDBApplication SDB = new SongsDB.SDBApplication();
Console.Out.WriteLine("MediaMonkey COM Appliation Object created.");
}
catch (COMException ex)
{
Console.Out.WriteLine("Failed to create MediaMonkey COM Appliation Object.");
Console.Out.WriteLine(ex.Message);
Console.Out.WriteLine(ex.StackTrace);
}
Console.Out.WriteLine("Press any key to continue.");
Console.ReadKey();
}
public static void ConnectToMediaMonkeyViaMarshalGetActiveObject()
{
try
{
Console.Out.WriteLine("Connecting to MediaMonkey COM Appliation Object via Marshal.GetActiveObject...");
SongsDB.SDBApplication SDB = (SongsDB.SDBApplication)Marshal.GetActiveObject("SongsDB.SDBApplication");
Console.Out.WriteLine("MediaMonkey COM Appliation Object connected.");
}
catch (COMException ex)
{
Console.Out.WriteLine("Failed to connect to MediaMonkey COM Appliation Object.");
Console.Out.WriteLine(ex.Message);
Console.Out.WriteLine(ex.StackTrace);
}
Console.Out.WriteLine("Press any key to continue.");
Console.ReadKey();
}
public static void ConnectToMediaMonkeyViaNativeCall()
{
try
{
Console.Out.WriteLine("Connecting to MediaMonkey COM Appliation Object via native call...");
Guid guid = Marshal.GenerateGuidForType(typeof(SongsDB.ISDBApplication));
object obj;
GetActiveObject(ref guid, IntPtr.Zero, out obj);
SongsDB.SDBApplication SDB = (SongsDB.SDBApplication)obj;
Console.Out.WriteLine("MediaMonkey COM Appliation Object connected.");
}
catch (COMException ex)
{
Console.Out.WriteLine("Failed to connect to MediaMonkey COM Appliation Object.");
Console.Out.WriteLine(ex.Message);
Console.Out.WriteLine(ex.StackTrace);
}
Console.Out.WriteLine("Press any key to continue.");
Console.ReadKey();
}
[DllImport("oleaut32.dll", PreserveSig = false)]
static extern void GetActiveObject(ref Guid rclsid, IntPtr pvReserved, [MarshalAs(UnmanagedType.IUnknown)] out Object ppunk);
}
}
Results with the following output, if MM is already running:
Code: Select all
Connecting to MediaMonkey COM Appliation Object via Marshal.GetActiveObject...
Failed to connect to MediaMonkey COM Appliation Object.
Vorgang nicht verfgbar. (Exception from HRESULT: 0x800401E3 (MK_E_UNAVAILABLE))
at System.Runtime.InteropServices.Marshal.GetActiveObject(Guid& rclsid, IntPtr reserved, Object& ppunk)
at System.Runtime.InteropServices.Marshal.GetActiveObject(String progID)
at CopyPlaylistsWithFiles.Program.ConnectToMediaMonkeyViaMarshalGetActiveObject() in D:\Benutzer\markus\documents\visual studio 2010\Projects\CopyPlaylistsWithFiles\CopyPlaylistsWithFiles\Program.cs:line 41
Press any key to continue.
Connecting to MediaMonkey COM Appliation Object via native call...
Failed to connect to MediaMonkey COM Appliation Object.
Vorgang nicht verfgbar. (Exception from HRESULT: 0x800401E3 (MK_E_UNAVAILABLE))
at CopyPlaylistsWithFiles.Program.GetActiveObject(Guid& rclsid, IntPtr pvReserved, Object& ppunk)
at CopyPlaylistsWithFiles.Program.ConnectToMediaMonkeyViaNativeCall() in D:\Benutzer\markus\documents\visual studio 2010\Projects\CopyPlaylistsWithFiles\CopyPlaylistsWithFiles\Program.cs:line 62
Press any key to continue.
Creating MediaMonkey COM Appliation Object...
Failed to create MediaMonkey COM Appliation Object.
Retrieving the COM class factory for component with CLSID {148F7BB6-4943-4C53-8E30-0F9115D30283} failed due to the following error: 80080005 Starten des Servers fehlgeschlagen (Exception from HRESULT: 0x80080005 (CO_E_SERVER_EXEC_FAILURE)).
at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck)
at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache)
at System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipVisibilityChecks, Boolean skipCheckThis, Boolean fillCache)
at System.Activator.CreateInstance(Type type, Boolean nonPublic)
at System.Activator.CreateInstance(Type type)
at CopyPlaylistsWithFiles.Program.ConnectOrCreateMediaMonkey() in D:\Benutzer\markus\documents\visual studio 2010\Projects\CopyPlaylistsWithFiles\CopyPlaylistsWithFiles\Program.cs:line 22
Press any key to continue.
If it is not running the method ConnectOrCreateMediaMonkey starts MM.
I have the same problem. If MediaMonkey is not running yet, I can create a new instance by calling "new SongsDB.SDBApplication();" and everything works fine. But if Media Monkey is already running, I cannot connect to the COM-Server. There seems to be no way to connect to a running instance.
Some C# code that demonstrates the problem:
[code]
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
namespace Test
{
class Program
{
static void Main(string[] args)
{
ConnectToMediaMonkeyViaMarshalGetActiveObject();
ConnectToMediaMonkeyViaNativeCall();
ConnectOrCreateMediaMonkey();
}
public static void ConnectOrCreateMediaMonkey()
{
try
{
Console.Out.WriteLine("Creating MediaMonkey COM Appliation Object...");
SongsDB.SDBApplication SDB = new SongsDB.SDBApplication();
Console.Out.WriteLine("MediaMonkey COM Appliation Object created.");
}
catch (COMException ex)
{
Console.Out.WriteLine("Failed to create MediaMonkey COM Appliation Object.");
Console.Out.WriteLine(ex.Message);
Console.Out.WriteLine(ex.StackTrace);
}
Console.Out.WriteLine("Press any key to continue.");
Console.ReadKey();
}
public static void ConnectToMediaMonkeyViaMarshalGetActiveObject()
{
try
{
Console.Out.WriteLine("Connecting to MediaMonkey COM Appliation Object via Marshal.GetActiveObject...");
SongsDB.SDBApplication SDB = (SongsDB.SDBApplication)Marshal.GetActiveObject("SongsDB.SDBApplication");
Console.Out.WriteLine("MediaMonkey COM Appliation Object connected.");
}
catch (COMException ex)
{
Console.Out.WriteLine("Failed to connect to MediaMonkey COM Appliation Object.");
Console.Out.WriteLine(ex.Message);
Console.Out.WriteLine(ex.StackTrace);
}
Console.Out.WriteLine("Press any key to continue.");
Console.ReadKey();
}
public static void ConnectToMediaMonkeyViaNativeCall()
{
try
{
Console.Out.WriteLine("Connecting to MediaMonkey COM Appliation Object via native call...");
Guid guid = Marshal.GenerateGuidForType(typeof(SongsDB.ISDBApplication));
object obj;
GetActiveObject(ref guid, IntPtr.Zero, out obj);
SongsDB.SDBApplication SDB = (SongsDB.SDBApplication)obj;
Console.Out.WriteLine("MediaMonkey COM Appliation Object connected.");
}
catch (COMException ex)
{
Console.Out.WriteLine("Failed to connect to MediaMonkey COM Appliation Object.");
Console.Out.WriteLine(ex.Message);
Console.Out.WriteLine(ex.StackTrace);
}
Console.Out.WriteLine("Press any key to continue.");
Console.ReadKey();
}
[DllImport("oleaut32.dll", PreserveSig = false)]
static extern void GetActiveObject(ref Guid rclsid, IntPtr pvReserved, [MarshalAs(UnmanagedType.IUnknown)] out Object ppunk);
}
}
[/code]
Results with the following output, if MM is already running:
[code]
Connecting to MediaMonkey COM Appliation Object via Marshal.GetActiveObject...
Failed to connect to MediaMonkey COM Appliation Object.
Vorgang nicht verfgbar. (Exception from HRESULT: 0x800401E3 (MK_E_UNAVAILABLE))
at System.Runtime.InteropServices.Marshal.GetActiveObject(Guid& rclsid, IntPtr reserved, Object& ppunk)
at System.Runtime.InteropServices.Marshal.GetActiveObject(String progID)
at CopyPlaylistsWithFiles.Program.ConnectToMediaMonkeyViaMarshalGetActiveObject() in D:\Benutzer\markus\documents\visual studio 2010\Projects\CopyPlaylistsWithFiles\CopyPlaylistsWithFiles\Program.cs:line 41
Press any key to continue.
Connecting to MediaMonkey COM Appliation Object via native call...
Failed to connect to MediaMonkey COM Appliation Object.
Vorgang nicht verfgbar. (Exception from HRESULT: 0x800401E3 (MK_E_UNAVAILABLE))
at CopyPlaylistsWithFiles.Program.GetActiveObject(Guid& rclsid, IntPtr pvReserved, Object& ppunk)
at CopyPlaylistsWithFiles.Program.ConnectToMediaMonkeyViaNativeCall() in D:\Benutzer\markus\documents\visual studio 2010\Projects\CopyPlaylistsWithFiles\CopyPlaylistsWithFiles\Program.cs:line 62
Press any key to continue.
Creating MediaMonkey COM Appliation Object...
Failed to create MediaMonkey COM Appliation Object.
Retrieving the COM class factory for component with CLSID {148F7BB6-4943-4C53-8E30-0F9115D30283} failed due to the following error: 80080005 Starten des Servers fehlgeschlagen (Exception from HRESULT: 0x80080005 (CO_E_SERVER_EXEC_FAILURE)).
at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck)
at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache)
at System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipVisibilityChecks, Boolean skipCheckThis, Boolean fillCache)
at System.Activator.CreateInstance(Type type, Boolean nonPublic)
at System.Activator.CreateInstance(Type type)
at CopyPlaylistsWithFiles.Program.ConnectOrCreateMediaMonkey() in D:\Benutzer\markus\documents\visual studio 2010\Projects\CopyPlaylistsWithFiles\CopyPlaylistsWithFiles\Program.cs:line 22
Press any key to continue.
[/code]
If it is not running the method ConnectOrCreateMediaMonkey starts MM.