C#生成com组件形式的dll供C++调用

①创建C#类库(ClassLibrary)、设置AssemblyInfo.cs中的[assembly: ComVisible(true)]默认是false、或者在接口和类之前添加设置为true
  

 [ComVisible(true)]
    [Guid("E709D3B9-18E8-4189-B1E0-49F72DD5A74C")]

    public interface CombineToolInterface{

       [DispId(1)]
       bool CalcuHeight(Object files, ref float fHeight)

}

利用VS工具中的创建GUID生成GUID

②定义接口其中每个接口对应一个[DispId(1)] id必须唯一。

③具体实现   

[ComVisible(true)]
    [Guid("C76A4C63-46DE-4D3A-8DD7-00E71B42D9AA")]
    [ClassInterface(ClassInterfaceType.None)]
    [ProgId("PDFCombine.CombineToolInterface")]

    public class CombineTool : CombineToolInterface{

      bool CalcuHeight(Object files, ref float fHeight){

              List<string> arrFile = new List<string>((string[])files);

              return true;}

}

④默认情况下会生成.tlh和.dll文件,然后使用VS类向导添加类选择 MFC Class From TypLib..如下图:

 

有.h和dll文件VC就可以使用了。

注:若C#参数需要数组,则可以定义为Object,C++对应的是VARINT
eg.
BOOL CalcuHeightWidth(VARIANT& files, float * fHeight) {
        BOOL result;
        static BYTE parms[] = VTS_VARIANT VTS_PR4 ;
       return result;
}


在COM中传递数组需要SAFEARRY,但是SAFEARRY需要使用VARIANT包装一下,如下:
   
 VARIANT arryVar;
 VariantInit( &arryVar );
 arryVar.vt = VT_ARRAY | VT_BSTR;
 SAFEARRAY* pSa = SafeArrayCreateVector(VT_BSTR, 0, vecTmpFiles.size());

 BSTR* bFile = new BSTR[vecTmpFiles.size()];
 for (int i = 0; i < vecTmpFiles.size(); ++i)
 {
      bFile[i] = SysAllocString(vecTmpFiles.at(i));
      SafeArrayPutElement(pSa,(long*)&i, bFile[i]);
 }

 SafeArrayAccessData(pSa, (void**)&bFile);
 arryVar.parray = pSa;
 SafeArrayUnaccessData(pSa);
 SafeArrayDestroy(pSa); //会自动释放BSTR* bFile数组,无需再释放bFile,否则重复释放。

 

 

 

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浮世

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值