c++builder如何使用OCX控件中的tagVARIANT*参数

老小笨鸟 2011-07-28 02:21:18
我最近在搞一个机器,提供一个OCX控件,安装后,打开正常,但在执行GetEnrollData接口函数时总是返回错误,代码贴出,请大拿帮忙看看:
void __fastcall TFormTestFingEnroll::cmdGetEnrollDataClick(TObject *Sender)
{
int vEnrollNumber,vEMachineNumber,vFingerNumber,vPrivilege,vErrorCode,i;
int iLen;
bool vRet;
tagVARIANT va;
VARIANT VA;
OleVariant oa;

lstEnrollData->Lines->Clear();
Label2->Caption = "";
lblMessage->Caption = "Working...";
vRet = FormTestFingM->FP_CLOCK1->EnableDevice(mMachineNumber, false);
if(!vRet)
{
lblMessage->Caption = gstrNoDevice;
return;
}
vEnrollNumber = txtEnrollNumber->Text.ToInt();
vFingerNumber = cmbBackupNumber->Text.ToInt();
vEMachineNumber = cmbEMachineNumber->Text.ToInt();
vRet = FormTestFingM->FP_CLOCK1->GetEnrollData(mMachineNumber,
vEnrollNumber,
vEMachineNumber,
vFingerNumber,
(long*)&vPrivilege,
oa,
(long*)&glngEnrollPData);
if(vRet)
{
cmbPrivilege->ItemIndex = vPrivilege;
lblMessage->Caption = "GetEnrollData OK";
if(vFingerNumber == 10)
lstEnrollData->Lines->Add((String(glngEnrollPData)));
else if(vFingerNumber==11)
{
txtCardNumber->Text = String(glngEnrollPData);
lstEnrollData->Lines->Add(String(glngEnrollPData));
}
else
{
//for(i = 0;i<DATASIZE - 1;i++)
//{
// lstEnrollData->Lines->Add(String((long*)glngEnrollData[i]));
//}
lstEnrollData->Lines->Add(String(glngEnrollData));
}
}
else
{
lstEnrollData->Lines->Add("oa.ArrayDimCount()"+IntToStr(oa.ArrayDimCount()));

for(i = 0;i<DATASIZE - 1;i++)
{
//lstEnrollData->Lines->Add(String(oa[i]);
}
FormTestFingM->FP_CLOCK1->GetLastError((long *)&vErrorCode);
lblMessage->Caption = ErrorPrint(vErrorCode);

lstEnrollData->Lines->Add("执行错误: GetEnrollData! ");
}
FormTestFingM->FP_CLOCK1->EnableDevice(mMachineNumber, true);
}
不管放VARIANT,OLEVARIANT,执行GetEnrollData都返回false,在VB下、DELPHI下都可以。DELPHI下用OLEVARIANT就可以。百思不得其解。
...全文
465 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
老小笨鸟 2011-08-19
  • 打赏
  • 举报
回复
不搞笑,总归发帖是想解决问题的啊,问题没有解决,怎么结呢?唉,bcb的OCX只能装,不能撤,想更新下也不行,看来得装个虚拟机,在那里装,卸不掉就删了
xtayaitak 2011-08-16
  • 打赏
  • 举报
回复
搞笑。那你就别结贴了吧。。
老小笨鸟 2011-08-16
  • 打赏
  • 举报
回复
没人知道啊?那我怎么结贴啊
老小笨鸟 2011-08-05
  • 打赏
  • 举报
回复
没有人遇到这个问题?那真是奇怪了,怎么没人回答呢?我这分怎么散啊
勉励前行 2011-08-02
  • 打赏
  • 举报
回复
卸载ACTIVEX控件
如果有卸载程序,就運行卸载程序。
如果沒有,一般調用 regsvr32 來卸载,然後再刪除相關文件就可以了。

對於那個 VARIANT* dwEnrollData, 你試試
OleVariant V = EmptyParam ; //BCB版本不一樣,或者是 EmptyParam().
然後用 (VARIANT *)&V 來調用。 
OleVariant 是從 Variant繼承的,可以強制轉換為VARIANT,直接使用 V 來調用是錯誤的,編譯器會做對象轉換(VARIANT*)(V)。而實際上該用指針轉換,即 (VARIANT *)&V
delphi 語法自動識別指針,對於 COM 的支持方便些,自動在VARIANT OleVariant 間轉換。delphi轉換的是指針,而不是對象。在BCB中,指針與對象有明確的標識,需要明確指出,這裡是要做指針強制轉換,而不是對象轉換。

注:(VARIANT*)(V) 會調用對象 V 的對應方法(操作符重載)返回一個VARIANT*
(VARIANT *)(&V) 則是指針強制轉換。
老小笨鸟 2011-08-02
  • 打赏
  • 举报
回复
regsvr32 -u 没有用,我发现bcb ActiveX控件能装不能卸,痛苦啊
jaffy 2011-08-02
  • 打赏
  • 举报
回复
是用命令来卸载,也就是在uninstall中调用regsvr32来卸载 好像是-u
老小笨鸟 2011-08-02
  • 打赏
  • 举报
回复
我让设备提供商改OCX,可我编译还是没变,想卸去OCX重新安装,可是卸不掉,现在也不知道是OCX问题还是BCB的问题,我上网找了,发现就是没有卸载OCX ACTIVEX的
老小笨鸟 2011-08-01
  • 打赏
  • 举报
回复
还有怎么完全卸载ACTIVEX控件?
勉励前行 2011-07-30
  • 打赏
  • 举报
回复
如果 Variant 需要初始化,你可以将其初始化为 EmptyParam
勉励前行 2011-07-30
  • 打赏
  • 举报
回复
注意一下:BCB 引入 OCX 時,可以自動生成頭文件,頭文件中的原型才是正確的。文檔中的可能未被更新。
使用OCX,你一定要看頭文件中對應的函數原型。

VARIANT* dwEnrollData,long* dwPassWord
對於指針,必須搞清楚用途是什麼,是否需要分配足夠的內存。現在的疑問是VARIANT* dwEnrollData,
這個dwEnrollData,應該是返回值,可能是一個未知數組,如果是這樣應該有專門的函數來解析這個返回值。
另外注意:對於 long * 你用0調用,也就是傳遞 NULL . 並不是傳遞一個值為0的整數。
老小笨鸟 2011-07-30
  • 打赏
  • 举报
回复
该机我调试用USB通讯方式,取人员信息、打开、关闭等都可以。
老小笨鸟 2011-07-30
  • 打赏
  • 举报
回复
奇怪就在这,好像这个OCX专门针对BCB的,vb、delphi的调用都对,就bcb不行,我自己试了写函数SetVariant、GetVariant,然后调用,VARIANT返回的都对,不知道bcb对ocx的参数传入做了转换还是怎么的。原型我上面也给了,_tlb.h我也看了,参数一致。我要崩溃了。
老小笨鸟 2011-07-30
  • 打赏
  • 举报
回复
文档中原型是: boolean GetEnrollData(
long dwMachineNumber,
long dwEnrollNumber,
long dwEMachineNumber,
long dwBackupNumber,
long* dwMachinePrivilege,
VARIANT* dwEnrollData,
long* dwPassWord
);
我用VARIANT va;
GetEnrollData(2,1,2,0,0,&va,0)调用,却总是返回false。
勉励前行 2011-07-30
  • 打赏
  • 举报
回复
對於取指紋或IC卡數據之類的應用,很多是RS232通訊,偶爾返回錯誤是常見的,但頻繁返回錯誤就不正常了。

當返回錯誤時,一般需要2~3次重試,以確認是否通訊故障。

其實我懷疑你的函數原型不對,希望確認一下頭文件中的函數原型。因為我遇到的其他COM,當需要傳遞數組時,使用的是 SafeArrmy *或多重指針。用 VARIANT * 指針返回數組時,想來也該是用OleVariant*吧。不過我對這方面沒研究。

老小笨鸟 2011-07-30
  • 打赏
  • 举报
回复
PPower,在吗?
老小笨鸟 2011-07-30
  • 打赏
  • 举报
回复
GetEnrollData的最后三个是返回参数,其中第6个参数后来我传了个初始化的VARIANT,返回还是FALSE,但我随后取错误,又返回0即SUCCESS,我现在也糊涂了,这个OCX做的返回错误也太奇怪了
老小笨鸟 2011-07-29
  • 打赏
  • 举报
回复
但我这样在delphi 调用成功了,真不明白
My_Love 2011-07-29
  • 打赏
  • 举报
回复
OleVariant oa; //你这个oa自始至终没有初始化!
Delphi的居部变量是会初始化为一堆0的!
勉励前行 2011-07-29
  • 打赏
  • 举报
回复
比較一下函數原型,及使用說明。
當參數中有 Variant 的時候,調用比較麻煩,因為需要匹配正確的Variant類型及參數,而這需要文檔來說明。
加载更多回复(1)

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧