首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

用vs2008 c++ 调用ocx控件有关问题

2012-06-09 
用vs2008 c++ 调用ocx控件问题现在手头有一个ocx控件,要调用其中的方法,写了如下代码:#include windows.h

用vs2008 c++ 调用ocx控件问题
现在手头有一个ocx控件,要调用其中的方法,写了如下代码:
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
#include <strsafe.h>
#include <dbt.h>


/*#import "c:/windows/system32/cryptocx.ocx" \
no_namespace no_smart_pointers raw_interfaces_only \
raw_native_types no_implementation named_guids*/
#import "c:/windows/system32/cryptocx.ocx" \
named_guids
//这个地方只加了一个named_guids的参数,因为如果写no_namespace会报“使用未声明标识符”的错误,加其他参数也会有其他不同问题

using namespace CRYPTOCXLib;

void main()
{
  try{
CoInitialize(NULL) ; 
  {
  if(1)
{
  _DCryptOcx* pCrypt = 0 ;  
  HRESULT hr = CoCreateInstance(
  CLSID_CryptOcx,//Com对象标识符
  0,//指向接口IUnknown指针
  CLSCTX_ALL,//运行可执行代码上下文
  DIID__DCryptOcx,//Com对象接口标识符
  reinterpret_cast<void**>(&pCrypt)//用来接收指向Com对象接口地址指针变量 
  );
assert( SUCCEEDED(hr) ) ;
if(pCrypt){
pCrypt->OpenDevice(L"111111");
pCrypt->Release();
}
}
  }  
  CoUninitialize() ;
  }
catch(_com_error *e)
{
MessageBoxA(NULL,e->ErrorMessage(),NULL,NULL);
}
}
这样子写直接debug,编译通过,程序执行之后,会弹出一个visual studio的messagebox,报错USBTest.exe 中的 0x7c812afb 处未处理的异常: Microsoft C++ 异常: 内存位置 0x0012fcd8 处的 _com_error。加断点逐步调试,是执行到pCrypt->OpenDevice(L"111111");这一句,这个方法再去调用其它的方法时,会报“CXX0030: 错误: 无法计算表达式的值”,因为ocx不是我写的,只是拿过来用,对方给的javascript的例子,就在网页载入了这个ocx,然后就直接可以调用opendevice方法,所以我也不知道现在是什么原因报错,请问我上面代码写的有问题么?本人c++菜鸟一个,请达人指教,谢谢

[解决办法]
既然是OCX文件,最好在视图里或对话框里,用右键选择"添加 ACTIVECONTROL"类似的选项,就是插入控件,然后再关联对应的变量和生成这个控件的消息函数就可以了.如果你的工程不方便用这种方法,就先生成一个对话框,在对话框里添加这个控件,生成关联变量和这个控件的消息函数,然后再把在添加这个控件时生成的类文件都考到你的工程里,并在你的工程里按照在对话框里的生成这个控件的关联变量和这个消息函数的格式及语法手工添加到你的工程里就行了
[解决办法]
CreateInstance已经写错了,参数必须是组件的CLSID,你填的是接口的IID
[解决办法]
你导入类型库后,CLSID和IID等所有GUID都会生成对应的变量,直接用即可。

你上面的CoCreateInstance的参数又错了,第一个参数是CLSID没错,但倒数第二个是IID,你填成了连接点接口(通常用DIID_开头),应该用IID_CryptOcx(如果没错的话应该有这个定义)。
其实用你之前的代码就可以了:
_DCryptOcxPtr pCrypt;
HRESULT hr = pCrypt.CreateInstance(CLSID_CryptOcx);
if(pCrypt)

[解决办法]
用VC向导生成一个对话框程序,然后你在资源视图里会显示生成的对话框,再右键选择类似"添加 ACTIVITE CONTROL"的选项,然后再关联这个控件的变量,这时就会生成这个控件的类文件,这时你就可以把生成的类文件考到你的工程里,至于这个控件的消息函数的映射语法,也可以在对话框里生成,然后把相应的代码考到你的工程里,

热点排行