-1
我想創建應該作爲使用C#的進程進行啓動的COM服務器。我使用COM interop支持嘗試了控制檯應用程序,客戶端可以創建我的服務器的COM對象並調用COM對象的方法。但我的服務器沒有啓動作爲進程(如out out server),也沒有調用我的服務器應用程序的main()函數。具有COM introp支持的C#控制檯應用程序
我需要創建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();
感謝,
你有迄今爲止所做的一些代碼示例嗎? – 2009-10-12 12:25:23
凱爾,我更新了我的代碼示例 – santhosh 2009-10-12 12:38:55