|
发表于 2015-11-1 01:41:55
|
显示全部楼层
本帖最后由 ryxcaixia 于 2015-11-2 09:00 编辑
简而言儿
普通的dll, 包含头文件, 将.lib包含到连接路径, 再把.dll文件放在工程目录下 直接调用 简单粗暴
重点是如果大家都是c/c++程序员 那么就特别方便 都是标准c接口
这是我给公司其他c程序员的写的算法接口
但是!如果公司的程序员是来自java和c#的怎么办, 他们也没有指针这个玩意
其实他们也可以直接调用标准c接口 不过非常的麻烦 要做各种类型转换(不止1个java和c#工程师和我吐槽)
然后 就有了com这个东西 com的dll, 是在普通的dll上又封装了一层
同样的功能 给java和c#工程师单独包装的
同样的函数
可以看到 所有的类型都是VARIANT类型, 这个是个万能变量, 具体看头文件实现, 结论就是如果传递简单的类型(非各种数组指针类型)
那么java和c#程序员拿过来就可以调用, 不必考虑类型转换
如果是数组类型, 那么恭喜你 中大奖了, 要考虑利用安全数组进行类型转换 (依然是c程序员在干苦力 把这个过程给搞定)
大概长成这个样子
在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;
}
|
评分
-
查看全部评分
|