龙马谷

 找回密码
 立即注册

QQ登录

只需一步,快速开始

龙马谷VIP会员办理客服QQ:82926983(如果临时会话没有收到回复,请先加QQ好友再发。)
1 [已完结] GG修改器新手入门与实战教程 31课 2 [已完结] GG修改器美化修改教程 6课 3 [已完结] GG修改器Lua脚本新手入门教程 12课
4 [已完结] 触动精灵脚本新手入门必学教程 22课 5 [已完结] 手游自动化脚本入门实战教程 9课 6 [已完结] C++射击游戏方框骨骼透视与自瞄教程 27课
7 [已完结] C++零基础UE4逆向开发FPS透视自瞄教程 29课 8 [已完结] C++零基础大漠模拟器手游自动化辅助教程 22课 9 [已完结] C++零基础开发DXF内存脚本辅助教程 32课
以下是天马阁VIP教程,本站与天马阁合作,赞助VIP可以获得天马阁对应VIP会员,名额有限! 点击进入天马阁论坛
1 [已完结] x64CE与x64dbg入门基础教程 7课 2 [已完结] x64汇编语言基础教程 16课 3 [已完结] x64辅助入门基础教程 9课
4 [已完结] C++x64内存辅助实战技术教程 149课 5 [已完结] C++x64内存检测与过检测技术教程 10课 6 [已完结] C+x64二叉树分析遍历与LUA自动登陆教程 19课
7 [已完结] C++BT功能原理与x64实战教程 29课 8 [已完结] C+FPS框透视与自瞄x64实现原理及防护思路
查看: 2949|回复: 0

C++ COM组件字符串数组的传递

[复制链接]

12

主题

0

回帖

15

积分

编程入门

Rank: 1

龙马币
32

在ATL下开发简单的COM组件很简单,唯一的难点在于复杂参数的传递。比如说字符串数组,需要学习SAFFARRAY,bstr以及VARIANT的用法。

下面贴出代码,展示一个字符串数组如何传递。

在COM组件的方法里面:
  1.   STDMETHODIMP CwordCountService::analyzeTheWordFile(BSTR filename, VARIANT* wordsSafearray, VARIANT* frequencySafearray)
  2. {
  3.         // TODO: 在此添加实现代码
  4.         MYWORD **wordArray;
  5.         int wordCount;
  6.         char *cFilename = _com_util::ConvertBSTRToString(filename);
  7.         //调用analyzeTxtWordFile函数对指定文档进行统计分析
  8.         analyzeTxtWordFile(cFilename, &wordArray, &wordCount);
  9.         delete cFilename;
  10.         cFilename = nullptr;

  11.         //把统计到的结果,存放到安全数组里面
  12.         VARIANT var1, var2;
  13.         VariantInit(&var1);
  14.         VariantInit(&var2);
  15.         var1.vt = VT_BSTR;
  16.         var2.vt = VT_INT;
  17.         SAFEARRAY *pArray1, *pArray2;
  18.         pArray1 = SafeArrayCreateVector(VT_VARIANT, 0, wordCount);
  19.         pArray2 = SafeArrayCreateVector(VT_VARIANT, 0, wordCount);
  20.         for (long i = 0; i < wordCount; i++)
  21.         {
  22.                 var1.bstrVal = _com_util::ConvertStringToBSTR(wordArray[i]->MYWORD);
  23.                 var2.intVal = wordArray[i]->count;
  24.                 SafeArrayPutElement(pArray1, &i, &var1);
  25.                 SafeArrayPutElement(pArray2, &i, &var2);
  26.                 free(wordArray[i]);
  27.         }
  28.         free(wordArray);

  29.         VariantClear(&var1);
  30.         VariantClear(&var2);
  31.         wordsSafearray->vt = VT_ARRAY | VT_VARIANT;
  32.         frequencySafearray->vt = VT_ARRAY | VT_VARIANT;
  33.         wordsSafearray->parray = pArray1;
  34.         frequencySafearray->parray = pArray2;
  35.         return S_OK;
  36. }
复制代码


调用COM组件的C++代码:
  1. #include <atlbase.h>  
  2. #import "D:\wordCountComponent.dll" no_namespace

  3. int main()
  4. {
  5.         //根据接口的clsid来初始化com组件
  6.         CoInitialize(NULL);
  7.         CLSID clsid;
  8.         HRESULT hr = CLSIDFromString(OLESTR("{40F2E186-5636-4F0D-87AB-DF351B41D133}"), &clsid);

  9.         //用智能指针去获取接口指针
  10.         CComPtr<IwordCountService> wordCountServicePtr;
  11.         hr = wordCountServicePtr.CoCreateInstance(clsid);
  12.         if (NOERROR != hr)
  13.         {
  14.                 printf("初始化com失败!\n");
  15.                 return -1;
  16.         }

  17.         VARIANT var1, var2;
  18.         VariantInit(&var1);
  19.         VariantInit(&var2);
  20.         SAFEARRAY *pArray1, *pArray2;

  21.         BSTR fileName = _com_util::ConvertStringToBSTR("d:/Romeo and Juliet.txt");
  22.         //调用analyzeTheWordFile函数分析文件,分析得到的结果存放在var1, var2的安全数组中
  23.         wordCountServicePtr->analyzeTheWordFile(fileName, &var1, &var2);
  24.         ::SysFreeString(fileName);
  25.         BSTR fileName2 = _com_util::ConvertStringToBSTR("d:/log.txt");
  26.         //分析完之后,可以利用得到的结果,调用createTxtLogFile生成统计文件
  27.         wordCountServicePtr->createTxtLogFile(fileName2, var1, var2);
  28.         ::SysFreeString(fileName2);

  29.         //下列代码展示了如何把数据从安全数组里面读取出来,并且保证内存不泄露
  30.         pArray1 = var1.parray;
  31.         pArray2 = var2.parray;

  32.         //获取安全数组的上下边界以及长度
  33.         long plLowBound, plUpperBound;
  34.         SafeArrayGetLBound(pArray1, 1, &plLowBound);
  35.         SafeArrayGetUBound(pArray1, 1, &plUpperBound);
  36.         int wordCount = plUpperBound - plLowBound + 1;
  37.         char **wordArray = new char*[wordCount];
  38.         int *frequencyArray = new int[wordCount];
  39.         VARIANT temp1, temp2;
  40.         VariantInit(&temp1);
  41.         VariantInit(&temp2);
  42.         for (long i = plLowBound; i <= plUpperBound; i++)
  43.         {
  44.                 ::SafeArrayGetElement(pArray1, &i, &temp1);
  45.                 ::SafeArrayGetElement(pArray2, &i, &temp2);
  46.                 wordArray[i] = _com_util::ConvertBSTRToString(temp1.bstrVal);
  47.                 frequencyArray[i] = temp2.intVal;
  48.         }

  49.         //把从安全数组读取出来的数据打印到屏幕上
  50.         for (long i = plLowBound; i <= plUpperBound; i++)
  51.         {
  52.                 printf("%s %d\n", wordArray[i], frequencyArray[i]);
  53.         }

  54.         //调用searchWord搜索指定单词出现频率
  55.         BSTR theWord = _com_util::ConvertStringToBSTR("the");
  56.         long frequency = 0;
  57.         wordCountServicePtr->searchWord(theWord, var1, var2, &frequency);
  58.         ::SysFreeString(theWord);
  59.         printf("所搜索的单词在文本出现频数为%ld次\n", frequency);

  60.         for (long i = plLowBound; i <= plUpperBound; i++)
  61.         {
  62.                 ::SafeArrayGetElement(pArray1, &i, &temp1);
  63.                 //释放掉安全数组里面的bstr内存
  64.                 ::SysFreeString(temp1.bstrVal);
  65.                 //释放掉字符串内存
  66.                 delete wordArray[i];
  67.         }
  68.         delete[] wordArray;
  69.         delete[] frequencyArray;

  70.         //安全数组使用完毕之后记得销毁
  71.         SafeArrayDestroy(pArray1);
  72.         SafeArrayDestroy(pArray2);
  73.         //释放智能指针
  74.         wordCountServicePtr.Release();
  75.         //卸载com组件
  76.         CoUninitialize();
  77.         return 0;
  78. }
复制代码


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

本版积分规则

龙马谷| C/C++辅助教程| 安卓逆向安全| 论坛导航| 免责申明|Archiver|
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表龙马谷立场!
任何人不得以任何方式翻录、盗版或出售本站视频,一经发现我们将追究其相关责任!
我们一直在努力成为最好的编程论坛!
Copyright© 2018-2021 All Right Reserved.
在线客服
快速回复 返回顶部 返回列表