C++ Builder建立COM服务程序的方法

2023-11-20

转:http://blog.csdn.net/jaminwm/article/details/463953

说明:最近学习关于用C++Builder建立Activex插件的使用,在网上找到了一些教程,这也是找到这篇文章,但是里边一些细节的东西说明的不清楚,通过自己摸索也类似的做出来了,这里以转的这篇文章为模板,对一些地方附上图片以细节说明。

1.创建支持COM接口对象的动态连接库文件:


◆打开File/New/ActiveX项目页,选择ActiveX Library;

◆选择Save All 将项目以PCOMServer文件名保存;此时C++ Builder 自动生成如下的文件:


PCOMServer.bpr:工程的项目文件;

PCOMServer.h,PCOMServer.cpp:支持COM对象的动态连接库源文件,其中有许多函数用于COM接口对象的自动装配,大家不用去编辑它们;

PCOMServer_ATL.h,PCOMServer_ATL.cpp:ATL形式的文件供C++ Builder编译器调用,大家也不要去编辑它们。

◆打开Project/Options/Linker 属性页不选中Use dynamic RTL选项,打开Project/Options/Packages属性页不选中Builder with runtime packages选项,这两步操作可以使开发的COM动态连接库不依赖C++ Builder的VCL动态连接库,有利于独立发行,但在一般情况下还是建议选中这两项。




2.1建立COM接口对象


打开File/New/ActiveX属性页,选择Automation Object表示向服务程序中插入一个自动类型的COM对象
我们选择这种类型的COM对象是为了可以自动注册,并且自动支持可以被其他语言调用。此时出现如下的对话框,输入COM类的名字MyCOM即可,对话框中的其它选项用于规定COM对象的性质,可查看帮助信息。




2.2.通过类型库编辑器编辑COM对象中相应接口对象的属性和方法



此时自动进入类型库编辑器,类型库用于存储COM对象的说明,是一个可以被多种语言调用的头文件包。在类型库中,可以定义COM对象的接口,定义接口对象的属性和方法等。类型库编辑器如下所示:



可以看出此时自动产生了MyCOM类的一个接口类IMyCOM,在COM应用软件中我们实际上是与接口对象打交道,下面通过类型库编辑器为IMyCOM接口定义方法和属性。
(首先选中IMyCOM类),如下图:

 


◆单击编辑器顶部的New Method按钮;

◆在Arributes页面的Name字段中输入方法的名称,本例中是AddInt用于整数加法;



◆在Parameters页面中,单击Add按钮编辑方法中的参数;



a,b,c,d,e是输入的整数,m用于返回运算的结果,必须定义为指针型

(如图)此图仅作参考,这里添加了多个参数。对于要输出的参数,要修改其对应的Modifier属性



◆切换到Flags页面,可以对接口的属性作调整;

◆在Text页面中可以检查生成的IDL代码:




[id(0x00000001)]

HRESULT _stdcall AddInt([in] int a, [in] int b, [in] int c, [in] int d, [in] int e, [out, retval] int * m );

◆单击Refresh Implementation按钮,此时可以关闭类型库编辑器。


当需要为接口添加新的属性和方法时,可以通过View/Type Library重新打开编辑器。选择Save All用C++ Builder提供的缺省文件名保存类型库的相关文件如下:


PCOMServer.TLB: 类型库文件;

PCOMServer_TLB.cpp:包含COM接口和对象的说明,其主要目的是方便访问,在客户程序中需将本文件包含到客户程序的工程中;

PCOMServer_TLB.h: PCOMServer_TLB.cpp的头文件,通过#include引入到客户程序中。

MyCOMImpl.cpp: 该文件是我们需要编写程序代码的地方,实现类型库定义的接口对象的方法和属性;

MyCOMImpl.h: MyCOMImpl.cpp的头文件。

2.3.实现COM接口中的方法


打开MyCOMImpl.cpp文件会发现我们在类型库编辑器中定义的方法,为该方法编写代码如下:


STDMETHODIMP TMyCOMImpl::AddInt(int a, int b, int c, int d, int e, int* m)
{
    *m=a+b+c+d-e;
    return S_OK;
}

2.4.生成DLL文件并注册COM对象


◆选择Project/Builder PCOMServer 生成PCOMServer.DLL文件。

◆打开类型库编辑器,单击Register按钮完成对COM对象的注册。




通过Windows任务栏中的Run菜单运行REGEDIT程序,在Windows注册表的HKEY_CLASSES_ROOT键下查找到PCOMServer.MyCOM子键,PCOMServer为DLL文件的名字,MyCOM为COM对象的名字,在下面可以看到该COM对象的全局唯一描述符CLSID如下:

{59834F03-49F1-11D3-B85B-00E09804A418}

注意:不同的机器生成的描述符不同.

在HKEY_CLASSES_ROOT键下查找到CLSID子键,在它下面找{59834F03-49F1-11D3-B85B-00E09804A418}子键,下面有如下的条目:

InprocServer32:存储PCOMServer.DLL的路径目录;

ProgID:存储COM对象的注册名:PCOMServer.MyCOM;

Typelib:存储COM对象的CLSID值{59834F03-49F1-11D3-B85B-00E09804A418}。

COM对象就是通过在注册表中的纪录实现DLL与客户程序的自动连接。

3.建立COM客户程序


客户程序将访问PCOMServer.DLL服务程序中的MyCOM对象,这些对象的说明保存在前面所述的TLB文件中。我们可以直接将PCOMServer_TLB.cpp加入到客户程序的项目文件中,并在客户程序中引用PCOMServer_TLB.h文件;也可以通过Project/Import Type Library引用PCOMServer_TLB.TLB文件,重新生成.cpp和.h文件,自动完成上述过程。




客户程序的编程重点是实现对服务程序中COM对象的方法的调用,调用的方法有多种,都是通过所谓的代理接口来完成的,这些代理接口在PCOMServer_TLB.h中有详细的定义,从这些定义中可以看出这些代理接口调用对象方法的过程。

PCOMServer_TLB.h文件很重要,包含了调用MyCOM对象的各种接口信息,该文件主要内容如下:


// Type Lib: D:/CAI/com/PCOMServer.tlb

// IID/LCID: {5BD378E5-4B57-11D3-B85B-00E09804A418}/0

// Helpfile:

// DepndLst:

// (1) v2.0 stdole, (C:/WINDOWS/SYSTEM/STDOLE2.TLB)

// (2) v4.0 StdVCL, (C:/WINDOWS/SYSTEM/STDVCL40.DLL)

// ************************************************************************

#ifndef __PCOMServer_TLB_h__

#define __PCOMServer_TLB_h__

#pragma option push -b -w-inl

#include <vcl/utilcls.h>

#if !defined(__UTILCLS_H_VERSION) || (__UTILCLS_H_VERSION < 0x0101)

#error "This file requires an newer version of the header file UTILCLS.H"

#endif

#include <olectl.h>

#include <ocidl.h>

#if defined(USING_ATLVCL) || defined(USING_ATL)

#if !defined(__TLB_NO_EVENT_WRAPPERS)

#include <atl/atlmod.h>

#endif

#endif

namespace Stdvcl {class IStrings; class IStringsDisp;}

using namespace Stdvcl;

namespace Pcomserver_tlb

{

DEFINE_GUID(LIBID_PCOMServer, 0x5BD378E5, 0x4B57, 0x11D3, 0xB8, 0x5B, 0x00, 0xE0, 0x98, 0x04, 0xA4, 0x18);

DEFINE_GUID(IID_IMyCOM, 0x5BD378E6, 0x4B57, 0x11D3, 0xB8, 0x5B, 0x00, 0xE0, 0x98, 0x04, 0xA4, 0x18);

DEFINE_GUID(CLSID_MyCOM, 0x5BD378E8, 0x4B57, 0x11D3, 0xB8, 0x5B, 0x00, 0xE0, 0x98, 0x04, 0xA4, 0x18);

interface DECLSPEC_UUID("{5BD378E6-4B57-11D3-B85B-00E09804A418}") IMyCOM;

typedef IMyCOM MyCOM;

#define LIBID_OF_MyCOM (&LIBID_PCOMServer)

interface IMyCOM : public IDispatch

{

public:

virtual HRESULT STDMETHODCALLTYPE AddInt(int x/*[in]*/, int y/*[in]*/, int* ret/*[out,retval]*/) = 0; // [1]

#if !defined(__TLB_NO_INTERFACE_WRAPPERS)

int __fastcall AddInt(int x/*[in]*/, int y/*[in]*/)

{

int ret;

OLECHECK(this->AddInt(x, y, &ret));

return ret;

}

#endif // __TLB_NO_INTERFACE_WRAPPERS

};

#if !defined(__TLB_NO_INTERFACE_WRAPPERS)

template <class T /* IMyCOM */ >

class TCOMIMyCOMT : public TComInterface<IMyCOM>, public TComInterfaceBase<IUnknown>

{

public:

TCOMIMyCOMT() {}

TCOMIMyCOMT(IMyCOM *intf, bool addRef = false) : TComInterface<IMyCOM>(intf, addRef) {}

TCOMIMyCOMT(const TCOMIMyCOMT& src) : TComInterface<IMyCOM>(src) {}

TCOMIMyCOMT& operator=(const TCOMIMyCOMT& src) { Bind(src, true); return *this;}

HRESULT __fastcall AddInt(int x/*[in]*/, int y/*[in]*/, int* ret/*[out,retval]*/);

int __fastcall AddInt(int x/*[in]*/, int y/*[in]*/);

};

typedef TCOMIMyCOMT<IMyCOM> TCOMIMyCOM;

template<class T>

class IMyCOMDispT : public TAutoDriver<IMyCOM>

{

public:

IMyCOMDispT(){}

IMyCOMDispT(IMyCOM *pintf)

{

TAutoDriver<IMyCOM>::Bind(pintf);

}

IMyCOMDispT& operator=(IMyCOM *pintf)

{

TAutoDriver<IMyCOM>::Bind(pintf);

return *this;

}

HRESULT BindDefault(/*Binds to new instance of CoClass MyCOM*/)

{

return OLECHECK(Bind(CLSID_MyCOM));

}

HRESULT BindRunning(/*Binds to a running instance of CoClass MyCOM*/)

{

return BindToActive(CLSID_MyCOM);

}

HRESULT __fastcall AddInt(int x/*[in]*/, int y/*[in]*/, int* ret/*[out,retval]*/);

int __fastcall AddInt(int x/*[in]*/, int y/*[in]*/);

};

typedef IMyCOMDispT<IMyCOM> IMyCOMDisp;

template <class T> HRESULT __fastcall

TCOMIMyCOMT<T>::AddInt(int x/*[in]*/, int y/*[in]*/, int* ret/*[out,retval]*/)

{

return (*this)->AddInt(x, y, ret);

}

template <class T> int __fastcall

TCOMIMyCOMT<T>::AddInt(int x/*[in]*/, int y/*[in]*/)

{

int ret;

OLECHECK(this->AddInt(x, y, &ret));

return ret;

}

template <class T> HRESULT __fastcall

IMyCOMDispT<T>::AddInt(int x/*[in]*/, int y/*[in]*/, int* ret/*[out,retval]*/)

{

static _TDispID _dispid(*this, OLETEXT("AddInt"), DISPID(1));

TAutoArgs<2> _args;

_args[1] = x /*[VT_INT:0]*/;

_args[2] = y /*[VT_INT:0]*/;

return OutRetValSetterPtr(ret /*[VT_INT:1]*/, _args, OleFunction(_dispid, _args));

}

template <class T> int __fastcall

IMyCOMDispT<T>::AddInt(int x/*[in]*/, int y/*[in]*/)

{

int ret;

this->AddInt(x, y, &ret);

return ret;

}

typedef TCoClassCreatorT<TCOMIMyCOM, IMyCOM, &CLSID_MyCOM, &IID_IMyCOM> CoMyCOM;

#endif // __TLB_NO_INTERFACE_WRAPPERS

}; // namespace Pcomserver_tlb

#if !defined(NO_IMPLICIT_NAMESPACE_USE)

using namespace Pcomserver_tlb;

#endif

#pragma option pop

#endif // __PCOMServer_TLB_h__

下面是文件中说明的主要对象及其定义:

interface IMyCOM : public IDispatch

class TCOMIMyCOMT : public TComInterface<IMyCOM>

class IMyCOMDispT : public TAutoDriver<IMyCOM>

class CoMyCOM: public CoClassCreator

◆IMyCOM:通过IDispatch接口来调用对象的方法,该接口可以使对象被不支持虚拟函数表(VTable)的语言(如Visual Basic)说调用。这是一种很慢很苯的接口调用方式。

◆TCOMIMyCOMT:通过所谓的智能接口来调用对象的方法,既可以实现IDispatch调用,也可以采用VTable进行调用,从而实现最快的调用速度。

◆IMyCOMDispT:通过disp接口来调用对象的方法,可以提高Idispatch接口的访问速度,但还是比不上VTable接口。

◆CoMyCOM:通过使用CoClassCreator可以自动产生TCOMIMyCOM代理的实例。

下面介绍一下实现智能接口和Disp接口调用的客户程序。这个客户程序很简单,有两个按钮分别完成两种接口调用的方法,一个编辑框显示结果。

4.插件的引用

完成以上操作后,新建一个项目。可在ActiveX项找到上边已经注册过的插件,点击添加到项目中,然后在项目中即可引用


◆智能接口的VTable调用方法如下:

int x=6,y=6;

TCOMIMyCOM O;

O=CoMyCOM::Create(); //通过CoClassCreator完成初始化

O->AddInt(x,y,&y); //Vtable形式调用

Edit1->Text=IntToStr(y);

◆DISP接口的调用方法如下:

int x=6,y=6;

IMyCOMDisp app;

app.BindDefault(); //通过Bind完成初始化

app.AddInt(x,y,&y); //Disp形式调用

Edit1->Text=IntToStr(y);






本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ Builder建立COM服务程序的方法 的相关文章

  • 从 ASP.Net 页面获取屏幕截图

    我有一个 ASP Net 页面 其中有一个按钮 单击该按钮时我想截取用户 PC 的屏幕截图并将其发送到服务器 我可以编写某种侦听器程序在服务器上运行以接受接收这些图像的请求 我有点模糊的是让用户的电脑发送屏幕截图的最佳方式 这是否需要通过为
  • 如何将 Scripting.FileSystemObject 标记为脚本安全?

    介绍 我正在为数控机床编程 确切地说是比雅斯的漫游者 用于编程的软件编辑器支持VBScript VBScript 用于实现条件语句和循环等 在软件说明中 我列出了 VBScript 中标记为不使用的所有语法 以避免复杂化 当然 我想使用 V
  • 未设置 Windows 默认打印机时出现“未选择默认打印机”错误

    当没有 Windows 默认打印机设置时 我需要打开打印机对话框 当设置了 Windows 默认打印机时 它可以与以下代码一起正常工作 TPrintDialog dlgPrint new TPrintDialog frmDisplayDet
  • 直接在 Excel 工作表上使用 ActiveX 控件的必要和充分要求是什么?

    Microsoft Office 支持文章 添加或注册 ActiveX 控件 https support office com en us article Add or register an ActiveX control 8fc743a
  • ActiveX 或 BHO(互联网浏览器)

    我需要浏览器插件 扩展专家的一些帮助 BHO 和 activeX 有什么区别 哪一个更难 我的目的是注入第三方脚本 顺便说一句 IE 浏览器和 ff 中有类似 localStorage 的东西吗 Thanks BHO 在启动时加载到 IE
  • 是否有 FMX 函数可以在运行时设置 TImage 的透明颜色?

    我在 FMX FireMonkey 的表单上有一个 TImage 我想在运行时将位图加载到 TImage 中 其中位图应该具有由位图中第一个像素的颜色定义的透明背景 该颜色可能因位图而异 我知道如何在设计时通过使用 TImage 的 Mul
  • 从 Javascript 变量创建 xls 或 csv 文件

    我有一个使用 Javascript 执行一些计算然后绘制数据的应用程序 但我想添加一个选项 以便用户能够实际将数据下载到 csv 或 xls 文件中 Javascript 或其他方法 中是否有一种方法可以让用户按下按钮 然后它会提示他们输入
  • Delphi 中的dynamic_cast 相当于什么?

    在Delphi中 相当于C 的什么dynamic cast reinterpret cast and static cast运算符 尤其是在对象上使用时 重新解释 cast 大多数时候 在 Delphi 中 演员表是reinterpret
  • Embarcadero WindowHandleToPlatform C++ 的示例

    我需要一个用于 C 构建器的 WindowHandleToPlatform 示例 我想使用句柄对表单执行 bitblt 和其他功能 我可以使用 VCL 来做到这一点并且效果很好 认为 WindowHandleToPlatform 是 fir
  • 可以使用 javascript 将 ActiveX 控件附加到页面吗?

    我正在尝试使用 jQuery 将 ActiveX 控件动态附加到页面 追加成功 但是 以这种方式完成后 控件不会初始化 我相信当包含控件的页面完成呈现时 IE 会调用 ActiveX 控件的 OnCreate 方法 问题是 直到渲染完成后
  • 链接器错误“包含无效的 OMF 记录”2

    我正在使用 Embarcadero XE8 C 构建器 32 位 我正在向我的程序添加一个库来解决Unresolved external error 当我添加库时 出现如标题所示的错误 于是我上网搜索了一下 在stackoverflow上找
  • C++ 构建器中的线程[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我是 C 构建器的新手 不熟悉线程
  • C++ Builder xe5 检测到错误(LME288)

    c Builder xe5 ilink32 Error 错误 无法执行链接 ilink32 警告 警告 检测到错误 LME288 当我尝试编译一个测试项目时发生了这种情况 时间 2019 05 17 标签 c builderxe5windo
  • 我可以检查 CoInitialize 是否已被调用吗?

    在具有ADO数据库连接的多线程环境中 我想知道CoInitialize是否已被调用 我该如何检查这个 通常你不应该做这个检查而只是打电话CoInitialize CoUnInitialize一对 你仍然可以这样做 function IsCo
  • 使用 TEmbeddedWB 或 TWebBrowser 检测外部内容

    我试图阻止由 TEmbeddedWB 或 TWebBrowser 或 TCppWebBrowser 加载的任何外部内容 我想阻止从互联网加载的任何内容 包括图像 javascript 外部 CSS 外部 embed 或 object 或 a
  • 如何将 FastMM 添加到 C++ Builder 项目?

    我正在尝试配置FASTMM4 for Builder C 6我遵循的步骤是 下载的 zip 文件来自来源锻造 http sourceforge net projects fastmm 在下面Project gt Options gt Lin
  • .NET COMException 接口未注册

    我无法理解这一点 我想使用该供应商的 OCXhttp www mobyt it http www mobyt it 发送短信 它是一个 dll 他们提供了 Vb NET Visual C 等的使用示例 我得到的例外是 System Runt
  • AxInterop 和 Interop 有什么区别?

    我已将 ocx 添加到 VS 的工具箱中 创建了两个 dll Interop NNN dll AxInterop NNN dll 每一个是什么 两者都需要吗 Interop xxx dll 和 AxInterop xxx dll 分别是引用
  • Windows 7 上的 IHTMLDocument2 和 Internet Explorer 11 更改

    I use TWebBrowser在我的应用程序中拥有 HTML 编辑器 当然这取决于安装的 Internet Explorer 版本 我注意到在 Windows 7 上安装全新的 Internet Explorer 11 后 我的编辑器发
  • QT 中的应用程序->处理消息?

    在 Borland 6 中 我经常使用它来解除程序操作的卡住 Application gt Processmessages 现在 对于 QT 4 8 1 我在这个外国 对我来说 QT 文档中找不到 谁能帮我 在 Qt 中 您可以使用静态函数

随机推荐

  • 机组logisim P0课下

    首先是记录猪脚强调的注意事项 输入信号一般是通过MUX 多路选择器来实现对输出结果的控制 刚连接好电路时或者连接电路中 可能有一些电路莫名其妙是蓝色 这时关闭logisim后再次打开就好了 Comparator器件默认是有符号的 要调成un
  • git commit提交之后,push 失败

    情况 在git commit m 备注 之后 git push 出现错误 出现的错误是 我提交的代码格式不满足要求 原因是 因为在一些公司里面 有提交代码的一个格式 就比如 m后面的备注信息 是要求有一定格式的 但是我第一遍的格式是写错了
  • 灰度图像的彩色复原方法 ——以人脸着色为例

    灰度图像的彩色复原方法 以人脸着色为例 代码文件下载地址 摘要 灰度图像彩色复原在图像修复领域有广泛的应用 由于其涉及从低纬度空间向高纬度空间的映射 故而修复效果存在差异 本文以人脸为例研究灰度图像的彩色复原方法 在主流灰度图像彩色修复算法
  • 数据库如何热备份

    1 1数据库冷备份 概念 在固定的周期内 人为的将数据库中的数据进行备份 一般一式三份 缺点 1 可能会造成数据丢失 2 如果数据量很多 则可能会导致备份时间很长 并且备份不能正常完成 说明 虽然冷备份有诸多的缺点 但是最好进行冷备份 因为
  • 什么是决策表?什么是决策树?

    决策树 是在已知各种情况发生概率的基础上 通过构成决策树来求取净现值的期望值大于等于零的概率 评价项目风险 判断其可行性的决策分析方法 是直观运用概率分析的一种图解法 这种决策分支画成图形很像一棵树的树干 故称决策树 它是一种树形结构 每个
  • PyCharm,idea通过插件database连接带Kerberos的hive

    1 目的 PyCharm通过插件database连接带Kerberos的hive 2 异常 我windows已经配置好kerberos 可以kinit通 其其他工具以及可以正常访问 但是通过PyCharm 或者idea等工具报如下错误 Ca
  • Spring中的监听器与SpringMVC简述

    目录 Spring中的监听器 SpringMVC概述 web层的框架完成的相应的操作图示 SpringMVC开发使用步骤 SpringMVC流程图示 前些天发现了一个巨牛的人工智能学习网站 通俗易懂 风趣幽默 忍不住分享一下给大家 点击跳转
  • javaScript实现-在两个文本框中输入值计算加减乘除法结果显示在另一个文本框中

    在两个文本框中输入值计算加减乘除法结果显示在另一个文本框中 方法一 用if else
  • Eclipse安转主题插件Theme出现问题解决办法

    1 2 3 直接在线安装输入Eclipse Color Theme Update Site 4 疯狂下一步 5 收功
  • 告别3D-DNA试试chromap和yahs做Hi-C辅助组装吧

    之前使用的是3D DNA流程做Hi C的辅助组装 它的最大优势就是输出结果可以对接下游的JBAT juicerbox with Assembly Tools 进行手动矫正 然而它点缺陷也很明显 处理速度不够快 且对植物的优化不行 同时目前许
  • 常微分方程(Ordinary Differential Equation III)

    常微分方程 一阶线性微分方程组 基本概念 解的存在和唯一性定理 齐次线性微分方程组 非齐次线性微分方程组 常系数线性微分方程组 常微分方程 Ordinary Differential Equation I 常微分方程 Ordinary Di
  • C结构体内char[] 数组的初始化

    一种C结构体内char 数组的初始化 include
  • 用户控件自定义 DependencyProperty

    用户控件自定义 DependencyProperty 属性使用教程 DependencyProperty 概念 依赖属性创建 自定义控件的依赖属性 DependencyProperty 概念 依赖属性就是一种可以自己没有值 并能通过使用Bi
  • 断电的方法关闭计算机,win7设置usb关机断电

    win7设置usb关机断电 win7设置usb关机拔出断电的解决方法 小伙伴们可能会经常性的遇到一个问题 就是win7电脑已经关闭了 但是插在计算机usb接口上的硬盘依然会被计算机供电 发出闪亮的光 这就让很多小伙伴们厌烦 为了帮小伙伴们解
  • 第十三篇、基于Arduino uno,获取薄膜压力传感器的值——结果导向

    0 结果 说明 先来看看串口调试助手显示的结果 第一个值是上电后检测到的平均压力值 第二个值是实时的压力值 第三个值是平均压力值和实时压力值的差值 如果是你想要的 可以接着往下看 1 外观 说明 虽然薄膜压力传感器形态各异 但是原理和代码都
  • Spring MVC下篇

    书接上回Spring MVC上篇 前面介绍了Spring MVC的服务器如何获得用户的请求 那么今天就来介绍一下服务器如何将响应返回给客户端 目录 3 服务器将结果返回给用户 前端 3 1 返回一个静态页面 3 2 返回 text html
  • 对wangeditor进行扩展---- 源代码

    看到有人对我做的WangEditor比较感兴趣 问了一些问题 但由于我并不常来 所以就没能及时答复 抱歉了 未避免以后类似问题发生 我将我修改的wangeditor js直接发在这里 有兴趣的可以下载后自己分析 希望能帮到需要的人 扩展后的
  • 【Docker安装部署Kafka+Zookeeper详细教程】

    Docker安装部署Kafka Zookeeper Docker拉取镜像 Docker拉取zookeeper的镜像 docker pull zookeeper Docker拉取kafka的镜像 docker pull wurstmeiste
  • 2022广东省安全员A证第三批(主要负责人)考试试题模拟考试平台操作

    题库来源 安全生产模拟考试一点通公众号小程序 2022广东省安全员A证第三批 主要负责人 培训试题为广东省安全员A证第三批 主要负责人 考试100题全真模拟题 2022广东省安全员A证第三批 主要负责人 考试试题模拟考试平台操作依据广东省安
  • C++ Builder建立COM服务程序的方法

    转 http blog csdn net jaminwm article details 463953 说明 最近学习关于用C Builder建立Activex插件的使用 在网上找到了一些教程 这也是找到这篇文章 但是里边一些细节的东西说明