COM形式是EXE文件存在的。出口在哪里呢

解决方案 »

  1.   

    出口是什么意思,使这个服务程序退出马,ATL建造的应该是MonitorShutdown()函数,可以看出来,他在推出的时候不断的查找dwWait == WAIT_OBJECT_0,也就是说没有接口在调用他了,然后就推出程序,MFC的EXE程序,ExitInstance()函数了,这是一个应用程序的退出函数了
      

  2.   

    我是用ATL创建的一个EXE服务的方式而且是第三个既服务方式的~~~运行的代码如下:
    void CServiceModule::Run()
    {
        _Module.dwThreadID = GetCurrentThreadId();    HRESULT hr = CoInitialize(NULL);
    //  If you are running on NT 4.0 or higher you can use the following call
    //  instead to make the EXE free threaded.
    //  This means that calls come in on a random RPC thread
    //  HRESULT hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);    _ASSERTE(SUCCEEDED(hr));    // This provides a NULL DACL which will allow access to everyone.
        CSecurityDescriptor sd;
        sd.InitializeFromThreadToken();
        hr = CoInitializeSecurity(sd, -1, NULL, NULL,
            RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL);
        _ASSERTE(SUCCEEDED(hr));    hr = _Module.RegisterClassObjects(CLSCTX_LOCAL_SERVER | CLSCTX_REMOTE_SERVER, REGCLS_MULTIPLEUSE);
        _ASSERTE(SUCCEEDED(hr));    LogEvent(_T("Service started"));
        if (m_bService)
            SetServiceStatus(SERVICE_RUNNING); InitCard();

        MSG msg;
        while (GetMessage(&msg, 0, 0, 0))
            DispatchMessage(&msg);

    ExitCard();    //我就是想把我这个自己写的函数加到这里面,可进程在杀死后就直接退出了;因为进程的消息队列也没有了,所以没有走我下面的ExitCard()函数,我的资源也没有释放掉;
       
        _Module.RevokeClassObjects();
        CoUninitialize();
      

  3.   

    我也正有此问题
    我在你那个InitCard地方调用我的函数(通过创建线程),我想在函数里边做些初始化工作,如果初始化成功,则继续向下运行,否则,提示一些信息并在那个地方return了。可是不行,服务还是启动了。我在创建线程后,WaitForSingleObject了,也是不行,WAIT_TIMEOUT,WAIT_OBJECT_0。
    我想在我的线程里结束的时候,停止服务,但不知道该如何才能停止掉服务,试了很多都不行
    如下: //InitCard();
         handle = CreateThread(...ThreadFun,...);
         DWORD dwRet = WaitForObject( handle, 10000 );  //等待10s
         if ( dwRet == WAIT_TIMEOUT )
         {
               // 线程一直在运行,说明线程启动正常,所以进行消息循环
             MSG msg;
             while (GetMessage(&msg, 0, 0, 0))
                 DispatchMessage(&msg);
         }
         else
         {
              // 线程很快就终止了,说明线程没有正常启动,或者连接不上数据库
         }
    //ExitCard();  
    线程函数ThreadFun
    {
       ....
       handle = CreateThread( ...SubThread... )
       WaitForSingleObject( handle, INFINITE );    //直到SubThread线程结束
       ... // 停止服务,就是不知道该如何写
       return 0;
    }