最近作项目,人家提供ACTIVEX,并且有VB DEMO
我们想用vc 来调用,结果不行VB DEMO 使用时,他们的一个EXE 必须运行着,然后使用
Set bt = GetObject("bactalk.activex.interface")
这样的语句就可以获得对象我在我vc 中使用如下
if( FAILED(::CLSIDFromProgID(L"bactalk.activex.interface", &clsid)))
TRACE("CLSIDFromProgID error"); // from Registry
if(::GetActiveObject(clsid, NULL, &pUnk) == S_OK)
{
VERIFY(pUnk->QueryInterface(IID_IDispatch, (void**)&pDisp) == S_OK);
vTxtAuto.AttachDispatch(pDisp);
pUnk->Release( );
TRACE(" attach complete \n");
}
结果调用失败,并且在注册表中找不到"bactalk.activex.interface",这样的信息,但是我不明白为什么VB可以使用.今晚再不能解决只能使用VB了希望各位帮忙~由衷感谢~~~
我们想用vc 来调用,结果不行VB DEMO 使用时,他们的一个EXE 必须运行着,然后使用
Set bt = GetObject("bactalk.activex.interface")
这样的语句就可以获得对象我在我vc 中使用如下
if( FAILED(::CLSIDFromProgID(L"bactalk.activex.interface", &clsid)))
TRACE("CLSIDFromProgID error"); // from Registry
if(::GetActiveObject(clsid, NULL, &pUnk) == S_OK)
{
VERIFY(pUnk->QueryInterface(IID_IDispatch, (void**)&pDisp) == S_OK);
vTxtAuto.AttachDispatch(pDisp);
pUnk->Release( );
TRACE(" attach complete \n");
}
结果调用失败,并且在注册表中找不到"bactalk.activex.interface",这样的信息,但是我不明白为什么VB可以使用.今晚再不能解决只能使用VB了希望各位帮忙~由衷感谢~~~
TRACE("CLSIDFromProgID error"); // from Registry 这一步就失败了,无法得到CLSID
是用过 加入他们的.tlb 得到相应的.h 和 .cpp 的
直接在注册表中找,看找得到 bactalk.activex.interface 吗?
然后找到XXX.tlh文件,里面会有CLSID
失败
//
// typelib filename: <could not determine filename>[
uuid(33FA6585-B81F-11D1-8257-00C0F009E3D7),
version(1.0)
]
library BACtalk
{
// TLib : // TLib : OLE Automation : {00020430-0000-0000-C000-000000000046}
importlib("stdole2.tlb"); // Forward declare all types defined in this typelib
dispinterface IBACtalkActiveXInterface; [
uuid(0D7E4BA1-B820-11D1-8257-00C0F009E3D7)
]
dispinterface IBACtalkActiveXInterface {
properties:
methods:
[id(0x00000001)]
VARIANT_BOOL AReadProperty(
long devinst,
short objecttype,
long objectinst,
long propertyid,
VARIANT_BOOL indexflag,
long index,
VARIANT* returndata,
short* returnerrtype,
short* returnerrclass,
short* returnerrcode);
[id(0x00000002)]
VARIANT_BOOL AReadPropertyEx(
long devinst,
short objecttype,
long objectinst,
long propertyid,
VARIANT_BOOL indexflag,
long index,
VARIANT* returndata,
long* updatecount,
short* returnerrtype,
short* returnerrclass,
short* returnerrcode);
[id(0x00000003)]
void AWriteProperty(
long devinst,
short objecttype,
long objectinst,
long propertyid,
VARIANT_BOOL indexflag,
long index,
VARIANT data,
short cmdprio);
[id(0x00000004)]
void ReadProperty(
long devinst,
short objecttype,
long objectinst,
long propertyid,
VARIANT_BOOL indexflag,
long index,
VARIANT* returndata,
short* returnerrtype,
short* returnerrclass,
short* returnerrcode);
[id(0x00000005)]
void WriteProperty(
long devinst,
short objecttype,
long objectinst,
long propertyid,
VARIANT_BOOL indexflag,
long index,
VARIANT data,
short cmdprio,
short* returnerrtype,
short* returnerrclass,
short* returnerrcode);
[id(0x00000006)]
void SendTimeSync();
[id(0x00000007)]
void FileReadStream(
long devinst,
long fileinst,
long position,
long numbytes,
VARIANT data,
long* numread,
short* errtype,
short* errclass,
short* errcode);
[id(0x00000008)]
void FileWriteStream(
long devinst,
long fileinst,
long position,
long numbytes,
VARIANT data,
short* errtype,
short* errclass,
short* errcode);
[id(0x00000009)]
VARIANT_BOOL TestSecurityLevel(short level);
[id(0x0000000a)]
void SendTimeSyncEx(
long useutctime,
long uselocaltime);
}; [
uuid(0D7E4BA3-B820-11D1-8257-00C0F009E3D7)
]
coclass BACtalkActiveXInterface {
[default] dispinterface IBACtalkActiveXInterface;
};
};
oleview 中显示的,应该是0D7E4BA1-B820-11D1-8257-00C0F009E3D7
这个吧
我也试过了,所以超级郁闷,为什么VB可以呢,vb连库都不用加,萨都不要,就可以用了~娘的~~
好像有点眉目
在ROT(Running object table)中有信息
然后在cmd里执行:
cd\
cd windows\system32
regsvr32 xxx.ocx 或 regsvr32 xxx.dll
然后试你自己的方法应该就会成功了.
也感谢其他仁兄建议。
结分