ActiveX控件是用MFC(VC6.0)写的,提供TCP/UDP Socket服务。使用CAsyncSocket类,MFC的Socket服务器模型也是基于窗口的.

解决方案 »

  1.   


    前言:Windows Service程序使用ActiveX控件的问题, 该ActiveX控件可以拖动到窗口上,但Windows Service没有窗口
    ActiveX控件是用MFC(VC6.0)写的,提供TCP/UDP Socket服务。使用CAsyncSocket类,MFC的Socket服务器模型也是基于窗口的.我要说的:MFC写的ActiveX控件改造为与窗口无关的控件,不就可以在Windows Service 中使用了吗。
      

  2.   

    可以创建一个父窗口句柄为HWND_MESSAGE的隐藏窗口作为ActiveX的容器
      

  3.   

    CSocket基于CAsyncSocket,都是基于窗口消息通知的Socket IO模型,AysncSelect模型
    ,如果要不基于窗口的用EventSelect模型,select模型,Overlapped IO或IOCP模型管理都可以呀、
      

  4.   

    因为你的控件是基于MFC的,不是基于framework的,因此需要有winform支持,在winform中拖放实例的时候是没有问题的,在DLL或者代码中去NEW的话,就会报“灾难性故障”,实际上是你的控件没有被完全实例化,这个时候需要一个代理类。 假设你的ocx叫MFCUserOCX.ocx,你自定义一个framework的自定义用户控件,假设工程名字叫UserControl,把MFCUserOCX.ocx拖上去,并对控件的方法、属性、事件进行二次封装,然后编译,会生成UserControl.dll、Interop.MFCUserOCX.dll、AxInterop.MFCUserOCX.dll三个DLL,把这三个DLL和MFCUserOCX.ocx一起放到你的工程中,引用UserControl.dll,在代码中new UserControl 就没有问题了,对MFCUserOCX.ocx的使用要通过这个代理类。 
    结帖结帖。
      

  5.   

     不好意思,刚看到你的邮件,我试了一下,解决方法如下:
        1、将你的服务更改为从sub main开始运行; 
        2、sub main在yourservice.designer.vb文件里,原代码是:<STAThread()> _
        <System.Diagnostics.DebuggerNonUserCode()> _
        Shared Sub Main()
    将<MTAThread()> _修改成<STAThread()> _
        3、用我之前的方法即可。