请教一个菜鸟问题,大家指点下吧

你妹的特盗不 2010-04-24 12:44:45
http://blog.csdn.net/simbi/archive/2008/12/04/3443010.aspx
我在上面这个LINK 看到了,用vs2008 的atl 做一个系统服务

对于那个客户程序调用 ,用的vb6 的代码不理解,谁能解释下吗?
怎么翻译成VC++的语言


Private Sub Form_Load()
  Dim math As ShowjiSvcLib.MyMath
  Set math = New ShowjiSvcLib.MyMath
  MsgBox math.Sum(10, 19)
  Set math = Nothing
End Sub
...全文
207 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
你妹的特盗不 2010-11-23
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 fhmeifly 的回复:]
不知道还有人关注这个问题没?
我想问下,关于 客户端访问测试 这块,要用VC++ 实现应该怎样编程?
[/Quote]

不清楚哦,我这个只是一个系统服务而已
程序会请求这个服务
fhmeiFly 2010-11-22
  • 打赏
  • 举报
回复
不知道还有人关注这个问题没?
我想问下,关于 客户端访问测试 这块,要用VC++ 实现应该怎样编程?
你妹的特盗不 2010-04-26
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 xuddk727 的回复:]
我越看越不明白,如果只是创建系统服务,CreateService即可了,放几行VB代码做什么
[/Quote]

创建了系统服务,我们的应用程序还要和系统服务打交道啊
你妹的特盗不 2010-04-25
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 qjipa 的回复:]
你编译成动态库?这个库能用regsvr32加载吗?

用regsvr32加载后再用vb调用一下?activex控件是看不到导出函数的
[/Quote]

我要的是把那个VB 翻译成VC语言,我的程序是用vc写的,我要知道用vc 怎么使用
chaoyong110 2010-04-25
  • 打赏
  • 举报
回复
学习了
许文君 2010-04-25
  • 打赏
  • 举报
回复
我越看越不明白,如果只是创建系统服务,CreateService即可了,放几行VB代码做什么
qjipa 2010-04-25
  • 打赏
  • 举报
回复
你编译成动态库?这个库能用regsvr32加载吗?

用regsvr32加载后再用vb调用一下?activex控件是看不到导出函数的
你妹的特盗不 2010-04-25
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 mackz 的回复:]
VB code
  Dim math As ShowjiSvcLib.MyMath '定义一个ShowjiSvcLib.MyMath类型的变量,VB是可以直接支持ActiveX作为类型的,只要引用了该库
  Set math = New ShowjiSvcLib.MyMath '创建一个该类型的ShowjiSvcLib.MyMath实例,其实这两句可以合并为:Dim math As New S……
[/Quote]
恩,谢谢,那请问怎么翻译成vc++的语言呢

我编译出来是动态的库....那个Sum 不是导出函数
你妹的特盗不 2010-04-25
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 yincheng01 的回复:]
现在许多 Windows Service 应用都可以用 c# 很好的完成,不过毕竟是托管代码,性能上不及非托管的 VC。网上能找到的 VC 写系统服务的例子,多数都用的 VC6(ATL3.0)。ATL3.0 写系统服务也很不错,只是封装的不很完善,还需要用户写不少代码。ATL7.0 及后续带的系统服务的模板有了更新,用起来简单多了。本文以 ATL 9.0 为例。

文章只是流水般的写了一下步骤……
[/Quote]

你的这个和我看到的是一个模子噻
尹成 2010-04-25
  • 打赏
  • 举报
回复
现在许多 Windows Service 应用都可以用 c# 很好的完成,不过毕竟是托管代码,性能上不及非托管的 VC。网上能找到的 VC 写系统服务的例子,多数都用的 VC6(ATL3.0)。ATL3.0 写系统服务也很不错,只是封装的不很完善,还需要用户写不少代码。ATL7.0 及后续带的系统服务的模板有了更新,用起来简单多了。本文以 ATL 9.0 为例。

文章只是流水般的写了一下步骤。要再具体一些,恐怕就不是一篇文章能做到的了。市面上讲 COM 的书很多,不妨买来看看。

下面就是用 Visual Studio 2008 中的 VC++ 2008 写系统服务的详细步骤(我用的 VC 是英文版的):

1. 新建项目。

1-1. 启动 Visual Studio 2008。选择 File -> New -> Project...。

1-2. 在 New Project 对话框中,选择 Visual C++ 中的 ATL Project 模板,写入项目名称:ShowjiSvc,点 OK。

1-3. 在打开的 ATL Project Wizard - ShowjiSvc 中,点 Application Settings,选择 Server type 为 Service(EXE),点 Finish。

2. 安装、卸载服务。

2-1. 编译项目。

2-2. 打开命令提示符,切换到编译后的目录,执行以下命令安装服务:
ShowjiSvc /Service

2-3. 打开服务管理,能找到一个名为 ShowjiSvc 的服务,启动类型是 Manual。可以启动服务、停止服务。

2-4. 停止服务,然后用以下命令卸载服务:
ShowjiSvc /UnRegServer

3. 修改服务的配置。

3-1. 修改服务名称:
在 Resource View 中打开 String Table,修改 IDS_SERVICENAME 的 Caption 为服务的名称:Showji Mobile Service。

3-2. 修改服务的描述:
打开 ShowjiSvc.cpp 文件,在 CShowjiSvcModule 的声明中增加以下函数声明:

  HRESULT RegisterAppId(bool bService);
再增加此函数的定义:

HRESULT CShowjiSvcModule::RegisterAppId(bool bService = false) throw()
{
  HRESULT hr = S_OK;
  BOOL res = __super::RegisterAppId(bService);
  if (bService)
  {
    if (IsInstalled())
    {
      SC_HANDLE hSCM = ::OpenSCManagerW(NULL, NULL, SERVICE_CHANGE_CONFIG);
      SC_HANDLE hService = NULL;
      if (hSCM == NULL)
        hr = AtlHresultFromLastError();
      else
      {
        hService = ::OpenService(hSCM, m_szServiceName, SERVICE_CHANGE_CONFIG);
        if (hService != NULL)
        {
          ::ChangeServiceConfig(hService, SERVICE_NO_CHANGE,
                  SERVICE_AUTO_START,  // 修改服务为自动启动
                  NULL, NULL, NULL, NULL, NULL, NULL, NULL,
                  m_szServiceName); // 通过修改资源IDS_SERVICENAME 修改服务的显示名字

          SERVICE_DESCRIPTION Description;
          TCHAR  szDescription[1024];
          ZeroMemory(szDescription, 1024);
          ZeroMemory(&Description, sizeof(SERVICE_DESCRIPTION));
          lstrcpy(szDescription, _T("www.showji.com 示例服务,by yangwei@ligsoft.com"));
          Description.lpDescription = szDescription;
          ::ChangeServiceConfig2(hService, SERVICE_CONFIG_DESCRIPTION, &Description);

          ::CloseServiceHandle(hService);
        }
        else
          hr = AtlHresultFromLastError();

        ::CloseServiceHandle(hSCM);
      }
    }
  }
  return hr;
}
3-3. 测试修改后的服务。
重新注册服务,在服务管理器中可以看到服务的新名称和描述,并且启动状态已经修改为 Automatic。
测试成功后,注销服务。

4. 修改服务的进程安全设置。

打开 ShowjiSvc.cpp,在 CShowjiSvcModule 的声明中,找到 InitializeSecurity 函数,修改如下:

  HRESULT InitializeSecurity() throw()
  {
    return CoInitializeSecurity( NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_NONE,
        RPC_C_IMP_LEVEL_IDENTIFY, NULL, EOAC_NONE, NULL );
  }
要根据自己的情况,做相关的安全性设置。如果没有什么特殊的安全性要求,就按照上面的格式写就行了。

如果没有设置进程安全性的代码,那么 VC 客户端创建对象的时候,会返回 E_ACCESSDENIED 的错误。
VB 客户端的错误提示如下:
实时错误 '70': 拒绝的权限(Run-time error '70': Permission denied)。

5. 增加服务的初始化和释放操作。

打开 ShowjiSvc.cpp,在 CShowjiSvcModule 的声明中,增加以下声明:

  HRESULT PreMessageLoop(int nShowCmd);
  HRESULT PostMessageLoop();
增加以上声明的相关定义:

HRESULT CShowjiSvcModule::PreMessageLoop(int nShowCmd) throw()
{
  HRESULT hr = __super::PreMessageLoop(nShowCmd);

// 微软的BUG
if (hr == S_FALSE) hr = S_OK;
  if (SUCCEEDED(hr))
  {
    // Add any custom code to initialize your service
  }

   return hr;
}



HRESULT CShowjiSvcModule::PostMessageLoop() throw()
{
   HRESULT hr = __super::PostMessageLoop();

   if (SUCCEEDED(hr))
   {
     // Add any custom code to uninitialize your service

   }

   return hr;
}
在相关的描述位置增加自己的代码即可。

6. 为服务增加一个叫做 MyMath 的示例组件。

6-1. 选中 ShowjiSvc 项目,点菜单 Project -> Add Class...,选择 ATL 中的 ATL Simple Object,点 Add。

6-2. 在打开的 ATL Simple Object Wizard - ShowjiSvc 对话框的 Short name 中写入组件名称:MyMath。其它名称会自动填好(当然您也可以修改)。

6-3. 在 Option 中可以看到许多选项。如果您搞不懂这些,就保留默认值吧(建议看一下 COM 的相关书籍)。

6-4. 打开 MyMath.rgs,为组件增加服务程序的 ID(代码中的红色粗体部分):

HKCR
{
   ShowjiSvc.MyMath.1 = s 'MyMath Class'
   {
     CLSID = s '{37F47E87-7D33-43CD-B591-DA01023F90BC}'
   }
   ShowjiSvc.MyMath = s 'MyMath Class'
   {
     CLSID = s '{37F47E87-7D33-43CD-B591-DA01023F90BC}'
     CurVer = s 'ShowjiSvc.MyMath.1'
   }
   NoRemove CLSID
   {
     ForceRemove {37F47E87-7D33-43CD-B591-DA01023F90BC} = s 'MyMath Class'
     {
       ProgID = s 'ShowjiSvc.MyMath.1'
       VersionIndependentProgID = s 'ShowjiSvc.MyMath'
       ForceRemove 'Programmable'
       LocalServer32 = s '%MODULE%'
       val AppID = s '%APPID%'
       'TypeLib' = s '{55E58774-E86F-4482-A521-38AE8C85FD1D}'
     }
   }
}
AppID 必须设置,否则客户端创建对象的时候会超时并报错误:80080005 server execution failed。
并且,系统日志中会出现一个错误:The server {uuid} did not register with DCOM within the required timeout.
VB 客户端的错误提示如下:
实时错误 '429': ActiveX 部件不能创建对象(Run-time error '429': ActiveX component can't create object)。

7. 为 MyMath 组件增加一个方法。

7-1. 在 Class View 中,右击 IMyMath,选择 Add -> Add Method...。

7-2. 在打开的 Add Method Wizard - ShowjiSvc 对话框中,输入 Method name: Sum;
Parameter type 选择 LONG,Parameter name 写 a,Parameter attributes 选择 in,点一下 Add;
Parameter type 选择 LONG,Parameter name 写 b,Parameter attributes 选择 in,点一下 Add;
Parameter type 选择 LONG*,Parameter name 写 s,Parameter attributes 选择 retval,点一下 Add;
点 Finish 添加这个方法。

7-3. 打开 MyMath.cpp 文件,找到 Sum 方法,修改如下:

STDMETHODIMP CMyMath::Sum(LONG a, LONG b, LONG* s)
{
   *s = a + b;
   return S_OK;
}
8. 编译、注册、启动服务。

8-1. 编译代码。

8-2. 注册服务,执行以下命令行代码:
ShowjiSvc /Service

8-3. 启动服务,执行以下命令行代码:
net start "Showji Mobile Service"
当然,也可以在服务管理器中启动服务。
相对应的停止服务的命令是:
net stop "Showji Mobile Service"

9. 客户端访问测试(用 VB6 举例)。

9-1. 打开 Visual Basic 6.0。

9-2. 新建“标准 EXE”工程。

9-3. 点菜单:工程 -> 引用...,找到 ShowjiSvc 1.0 Type Library 并勾选,点确定。

9-4. 双击 Form1 窗体,进入代码模式,输入以下代码:

Private Sub Form_Load()
  Dim math As ShowjiSvcLib.MyMath
  Set math = New ShowjiSvcLib.MyMath
  MsgBox math.Sum(10, 19)
  Set math = Nothing
End Sub

执行后可以看到,VB 正常初始化了系统服务中的 COM 对象,并调用了其中的方法。


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/simbi/archive/2008/12/04/3443010.aspx
wltg2001 2010-04-24
  • 打赏
  • 举报
回复
真想帮忙啊,可惜VB我不是太会啊
Eleven 2010-04-24
  • 打赏
  • 举报
回复
VB 不会。。。
菜牛 2010-04-24
  • 打赏
  • 举报
回复
  Dim math As ShowjiSvcLib.MyMath '定义一个ShowjiSvcLib.MyMath类型的变量,VB是可以直接支持ActiveX作为类型的,只要引用了该库
  Set math = New ShowjiSvcLib.MyMath '创建一个该类型的ShowjiSvcLib.MyMath实例,其实这两句可以合并为:Dim math As New ShowjiSvcLib.MyMath
  MsgBox math.Sum(10, 19) '调用该math对象的Sum接口方法,把结果用MsgBox显示出来
  Set math = Nothing '销毁math对象

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧