鱼C论坛

 找回密码
 立即注册
查看: 2162|回复: 3

COM做出的DLL比普通DLL有什么增强?

[复制链接]
发表于 2015-11-1 01:41:54 | 显示全部楼层 |阅读模式
20鱼币

最佳答案

查看完整内容

简而言儿 普通的dll, 包含头文件, 将.lib包含到连接路径, 再把.dll文件放在工程目录下 直接调用 简单粗暴 重点是如果大家都是c/c++程序员 那么就特别方便 都是标准c接口 这是我给公司其他c程序员的写的算法接口 但是!如果公司的程序员是来自java和c#的怎么办, 他们也没有指针这个玩意 其实他们也可以直接调用标准c接口 不过非常的麻烦 要做各种类型转换(不止1个java和c#工程师和我吐槽) 然后 就有了com这个东西 com ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-11-1 01:41:55 | 显示全部楼层
本帖最后由 ryxcaixia 于 2015-11-2 09:00 编辑

简而言儿
普通的dll, 包含头文件, 将.lib包含到连接路径, 再把.dll文件放在工程目录下 直接调用 简单粗暴
重点是如果大家都是c/c++程序员 那么就特别方便 都是标准c接口
这是我给公司其他c程序员的写的算法接口
1.png


但是!如果公司的程序员是来自java和c#的怎么办, 他们也没有指针这个玩意
其实他们也可以直接调用标准c接口 不过非常的麻烦 要做各种类型转换(不止1个java和c#工程师和我吐槽)
然后 就有了com这个东西  com的dll, 是在普通的dll上又封装了一层
同样的功能 给java和c#工程师单独包装的
1.png

同样的函数
可以看到 所有的类型都是VARIANT类型, 这个是个万能变量, 具体看头文件实现, 结论就是如果传递简单的类型(非各种数组指针类型)
那么java和c#程序员拿过来就可以调用, 不必考虑类型转换
如果是数组类型, 那么恭喜你 中大奖了, 要考虑利用安全数组进行类型转换 (依然是c程序员在干苦力 把这个过程给搞定)
大概长成这个样子

1.png

在c#里面直接丢进去一个空object(貌似他们里面是叫这个 看过几次), 跑完这个算法 就会得到一个有值得东西
但是这个变量 还不支持他们直接往数据库里写 虽然他们可以手动完成这个转换 但是他们想一个'=' 赋值操作符 就可以完成向数据库写的过程
于是乎又有了下面这个测试了n遍的工具函数 小仙如果以后开发com 绝对让c# java程序员爱死你 一步到位

  1. // 参数 VARTYPE vt 表示 VARIANT& Variant 的数组元素类型,可能是 VT_I1、VT_I2、VT_I4 或 VT_UI1、VT_UI2、VT_UI4。
  2. BOOL aut::ByteArrayToVariant(LPBYTE lpData, UINT nSize, VARIANT& Variant, VARTYPE vt)
  3. {
  4.         // COleVariant::Attach() means Copy !!! ××× //
  5.         COleVariant& oVar = *(COleVariant*)&Variant;

  6.         if (nSize == 0)
  7.         {
  8.                 oVar.Clear();
  9.                 return TRUE;
  10.         }

  11.         SHORT arType[6] = { VT_I1, VT_I2, VT_I4, VT_UI1, VT_UI2, VT_UI4 };
  12.         vector<SHORT> vcType(arType, arType+6);

  13.         vector<SHORT>::iterator it = find(vcType.begin(), vcType.end(), vt);
  14.         if (it == vcType.end())
  15.                 return FALSE;

  16.         if (vt == VT_I1 || vt == VT_UI1)
  17.         {
  18.                 CByteArray byArray;
  19.                 byArray.SetSize(nSize);
  20.                 memcpy(byArray.GetData(), lpData, nSize);
  21.                 oVar = byArray;
  22.                 oVar.ChangeType(VT_ARRAY|vt);
  23.                 return TRUE;
  24.         }

  25.         COleSafeArray osa;
  26.         if (vt == VT_I2 || vt == VT_UI2)
  27.         {
  28.                 LPSHORT Array = (LPSHORT)lpData;
  29.                 DWORD Count = nSize/sizeof(SHORT);
  30.                 osa.Create(vt, 1, &Count);
  31.                 for (LONG i = 0; i < Count; i ++)
  32.                         osa.PutElement(&i, &Array[i]);
  33.         }
  34.         else // if (vt == VT_I4 || vt == VT_UI4)
  35.         {
  36.                 LPLONG Array = (LPLONG)lpData;
  37.                 DWORD Count = nSize/sizeof(LONG);
  38.                 osa.Create(vt, 1, &Count);
  39.                 for (LONG i = 0; i < Count; i ++)
  40.                         osa.PutElement(&i, &Array[i]);
  41.         }
  42.         oVar = osa;

  43.         return TRUE;
  44. }

  45. // 参数 VARTYPE vt 表示 VARIANT& Variant 的数组元素类型,可能是 VT_I1、VT_I2、VT_I4 或 VT_UI1、VT_UI2、VT_UI4。
  46. BOOL aut::ByteArrayToVariant(CByteArray& byArray, VARIANT& Variant, VARTYPE vt)
  47. {
  48.         UINT nSize = byArray.GetSize();
  49.         // COleVariant::Attach() means Copy !!! ××× //
  50.         COleVariant& oVar = *(COleVariant*)&Variant;

  51.         if (nSize == 0)
  52.         {
  53.                 oVar.Clear();
  54.                 return TRUE;
  55.         }

  56.         SHORT arType[6] = { VT_I1, VT_I2, VT_I4, VT_UI1, VT_UI2, VT_UI4 };
  57.         vector<SHORT> vcType(arType, arType+6);

  58.         vector<SHORT>::iterator it = find(vcType.begin(), vcType.end(), vt);
  59.         if (it == vcType.end())
  60.                 return FALSE;

  61.         if (vt == VT_I1 || vt == VT_UI1)
  62.         {
  63.                 oVar = byArray;
  64.                 oVar.ChangeType(VT_ARRAY|vt);
  65.                 return TRUE;
  66.         }

  67.         COleSafeArray osa;
  68.         if (vt == VT_I2 || vt == VT_UI2)
  69.         {
  70.                 LPSHORT Array = (LPSHORT)byArray.GetData();
  71.                 DWORD Count = nSize/sizeof(SHORT);
  72.                 osa.Create(vt, 1, &Count);
  73.                 for (LONG i = 0; i < Count; i ++)
  74.                         osa.PutElement(&i, &Array[i]);
  75.         }
  76.         else // if (vt == VT_I4 || vt == VT_UI4)
  77.         {
  78.                 LPLONG Array = (LPLONG)byArray.GetData();
  79.                 DWORD Count = nSize/sizeof(LONG);
  80.                 osa.Create(vt, 1, &Count);
  81.                 for (LONG i = 0; i < Count; i ++)
  82.                         osa.PutElement(&i, &Array[i]);
  83.         }
  84.         oVar = osa;

  85.         return TRUE;
  86. }
复制代码

评分

参与人数 1荣誉 +16 鱼币 +16 贡献 +10 收起 理由
拈花小仙 + 16 + 16 + 10 精彩回复~

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-11-11 22:49:46 | 显示全部楼层
牛逼。。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-1-19 21:14:28 | 显示全部楼层
ryxcaixia 发表于 2015-11-1 01:41
简而言儿
普通的dll, 包含头文件, 将.lib包含到连接路径, 再把.dll文件放在工程目录下 直接调用 简单粗暴
...

好牛逼啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-18 19:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表