-1 votes

Application console C# avec support COM introp

Je veux créer un serveur COM qui doit être lancé comme un processus en utilisant C#. J'ai essayé l'application console avec le support COM interop, le client peut créer l'objet COM de mon serveur et appeler la méthode de l'objet COM. Mais mon serveur n'est pas lancé en tant que processus (comme un serveur hors processus), et la fonction main() de mon application serveur n'est pas appelée.

Je dois créer le serveur COM en tant que processus séparé pour éviter les problèmes de compatibilité avec le cadre de travail .net.

Mon code ci-dessous,

[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);
    }

}

Et la fonction principale du serveur,

public class Program
    {
        static void Main(string[] args)
        {
            MessageBox.Show("Server main called");
        }
    }

Mon client 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();

Merci,

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X