鱼C论坛

 找回密码
 立即注册
查看: 2331|回复: 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程序员爱死你 一步到位
// 参数 VARTYPE vt 表示 VARIANT& Variant 的数组元素类型,可能是 VT_I1、VT_I2、VT_I4 或 VT_UI1、VT_UI2、VT_UI4。
BOOL aut::ByteArrayToVariant(LPBYTE lpData, UINT nSize, VARIANT& Variant, VARTYPE vt)
{
        // COleVariant::Attach() means Copy !!! ××× //
        COleVariant& oVar = *(COleVariant*)&Variant;

        if (nSize == 0)
        {
                oVar.Clear();
                return TRUE;
        }

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

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

        if (vt == VT_I1 || vt == VT_UI1)
        {
                CByteArray byArray;
                byArray.SetSize(nSize);
                memcpy(byArray.GetData(), lpData, nSize);
                oVar = byArray;
                oVar.ChangeType(VT_ARRAY|vt);
                return TRUE;
        }

        COleSafeArray osa;
        if (vt == VT_I2 || vt == VT_UI2)
        {
                LPSHORT Array = (LPSHORT)lpData;
                DWORD Count = nSize/sizeof(SHORT);
                osa.Create(vt, 1, &Count);
                for (LONG i = 0; i < Count; i ++)
                        osa.PutElement(&i, &Array[i]);
        }
        else // if (vt == VT_I4 || vt == VT_UI4)
        {
                LPLONG Array = (LPLONG)lpData;
                DWORD Count = nSize/sizeof(LONG);
                osa.Create(vt, 1, &Count);
                for (LONG i = 0; i < Count; i ++)
                        osa.PutElement(&i, &Array[i]);
        }
        oVar = osa;

        return TRUE;
}

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

        if (nSize == 0)
        {
                oVar.Clear();
                return TRUE;
        }

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

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

        if (vt == VT_I1 || vt == VT_UI1)
        {
                oVar = byArray;
                oVar.ChangeType(VT_ARRAY|vt);
                return TRUE;
        }

        COleSafeArray osa;
        if (vt == VT_I2 || vt == VT_UI2)
        {
                LPSHORT Array = (LPSHORT)byArray.GetData();
                DWORD Count = nSize/sizeof(SHORT);
                osa.Create(vt, 1, &Count);
                for (LONG i = 0; i < Count; i ++)
                        osa.PutElement(&i, &Array[i]);
        }
        else // if (vt == VT_I4 || vt == VT_UI4)
        {
                LPLONG Array = (LPLONG)byArray.GetData();
                DWORD Count = nSize/sizeof(LONG);
                osa.Create(vt, 1, &Count);
                for (LONG i = 0; i < Count; i ++)
                        osa.PutElement(&i, &Array[i]);
        }
        oVar = osa;

        return TRUE;
}

评分

参与人数 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-11-26 18:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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