我想创建COM服务器,应该使用C#作为进程进行语言管理。我尝试使用COM互操作支持控制台应用程序,客户端可以创建我的服务器的COM对象并调用COM对象的方法。但我的服务器没有作为进程启动(如out process server),也没有调用我的服务器应用程序的main()函数。
我需要创建COM服务器作为单独的进程,以避免.net框架兼容性问题。
我的代码如下,
[Guid("321003E2-51E5-4acd-BC0E-3C9F42235748"), InterfaceType(ComInterfaceType.InterfaceIsDual)]
public interface ITestInterface
{
void PrintHi([In, MarshalAs(UnmanagedType.BStr)] string name);
}
[Guid("259689FE-58E4-4175-A82B-4E3827861767"), ProgId("MyTestApp.TestCom")]
public class TestCom : ITestInterface
{
public TestCom()
{
}
[ComRegisterFunction]
public static void RegisterClass(string key)
{
StringBuilder strReg = new StringBuilder(key);
strReg.Replace(@"HKEY_CLASSES_ROOT\", "");
RegistryKey classReg = Registry.ClassesRoot.OpenSubKey(strReg.ToString(), true);
classReg.Close();
}
[ComUnregisterFunction]
public static void UnregisterClass(string key)
{
StringBuilder strReg = new StringBuilder(key);
strReg.Replace(@"HKEY_CLASSES_ROOT\", "");
RegistryKey classReg = Registry.ClassesRoot.OpenSubKey(strReg.ToString(), true);
classReg.Close();
}
public void PrintHi(string name)
{
MessageBox.Show(name);
}
}
和服务器主要功能,
public class Program
{
static void Main(string[] args)
{
MessageBox.Show("Server main called");
}
}
我的vc ++客户端,
ITestInterface *cpi = NULL;
HRESULT hr = CoInitialize(NULL);
hr = CoCreateInstance(CLSID_TestCom, NULL, CLSCTX_ALL, IID_ITestInterface, (LPVOID *)&cpi);
if (SUCCEEDED(hr))
{
cpi->PrintHi(_bstr_t("Test param"));
cpi->Release();
cpi = NULL;
}
CoUninitialize();
谢谢,
答案 0 :(得分:1)
您需要在COM +中注册COM组件,或者需要通过单独的任务启动服务器。 COM本身不会在进程外服务器中创建对象。