调用ActiveX控件问题

Nonetracer 2009-04-02 04:10:21
大家好,我是做Java开发的,现在需要用VC++调用ActiveX控件,不清楚如何操作,所以请教一下。

目标是这样的:我要用VC++生成一个封装了A控件的dll。然后这个dll开放了一些供外部调用的函数。
比如:有一个connect()函数,里面的实现是调用A控件的coonnect()函数。

1、我是否应该创建一个MFC AppWizard(dll)工程?

2、我用创建了MFC AppWizard(dll)这个工程后,已经将A控件导入,ClassView中显示了CA.h(A控件的头文件)。我想根据A中可以访问的函数声明出dll外部可以调用的函数应该如何操作?
比如,我在cpp文件中声明public boolean connect_com()函数,函数里面的实现是调用A控件的connect(int number)函数。

3、如何要用代码创建一个A控件的实例该如何创建?我使用CA ca = new CA()是否正确?我这样实现时程序编译不报错,但运行是就会出异常。

不知道我的问题是否说清楚,谢谢大家~~~
...全文
154 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Nonetracer 2009-04-03
  • 打赏
  • 举报
回复
非常感谢liangwei_2008和iitlhnhlhnh的帮助。我试一下
iitlhnhlhnh 2009-04-03
  • 打赏
  • 举报
回复
只是调方法可以这样:
#import “A.dll" no_namespace //路径

IAPtr m_pA;

::CoInitialize(NULL);
HRESULT hr = m_pA.CreateInstance(__uuidof(A));
if(FAILED(hr))
{
return FALSE;
}
m_pA->Connect_COM(1, 1, 115200);
//是一般COM控件的调用方法;应该可以,你可以试试看
iitlhnhlhnh 2009-04-03
  • 打赏
  • 举报
回复
只是调方法可以这样:
#import “A.dll" no_namespace //路径

IA m_pA;

::CoInitialize(NULL);
HRESULT hr = m_pA.CreateInstance(__uuidof(A));
if(FAILED(hr))
{
return FALSE;
}
m_pA->Connect_COM(1, 1, 115200);
//是一般COM控件的调用方法;应该可以,你可以试试看
liangwei_2008 2009-04-03
  • 打赏
  • 举报
回复
1、使用CA ca;这样就可以直接调用里面的方法了 不用new
C++里面定义指针后 才用new来生成对象
直接用对象条用里面的方法 ca.createEx()
对象的指针调用里面的方法 ca->createEx()

2、ca->CreateEx(...) 这个要看具体的需要,比如说窗体,只定义对象是不够的,需要create一下才能把窗口句柄之类的资源都初始化好,你的这个控件,我觉得应该不需要。(即使控件中有窗体,也是你控件的内部进行create)

3.只看你那几行代码是没问题的,但问什么连接串口就异常呢
你试试这样改写下

CZkApp::CZkApp()
{
// TODO: add construction code here,
// Place all significant initialization in InitInstance
CA *ca ;
ca = NULL ;
ca = new CA;
if(NULL != ca)//确保你的ca是有效的
{
ca->Connect_COM(1, 1, 115200);
}
}

还有一个,尽量别再Zk的构造函数中写代码,因为在构造未完成的情况下去做事情,可能会有各种各样的问题。
可以添加个onCreate函数,把代码写到这个函数里,(但我个人认为你程序出现异常应该和这没问题)。
iitlhnhlhnh 2009-04-03
  • 打赏
  • 举报
回复
可以直接IMPORT
然后用智能指针
Nonetracer 2009-04-03
  • 打赏
  • 举报
回复
Help~~~
Nonetracer 2009-04-02
  • 打赏
  • 举报
回复
谢谢ls~~~~

1、使用CA ca;这样就可以直接调用里面的方法了吗?不用new?(Java是要new的,呵呵)

2、由于CA是一个控件,我看网上有的代码要使用ca->CreateEx(...)创建,请问是否需要调用它?该方法的意义我不太清楚,我的目的不是要显示,只要构造出CA对象能够让我调用它的方法就可以。

3、为了测试,我将CA放在了CZkApp的构造函数中:
CZkApp::CZkApp()
{
// TODO: add construction code here,
// Place all significant initialization in InitInstance
CA *ca = new CA;
ca->Connect_COM(1, 1, 115200); //ca中有该方法,BOOL Connect_COM(int port, int num, int baudrate);
}

以上是我添加CA的一段代码。不知是否可以?(ZK是我的Project名称,所以自动生成了一个CZKApp.cpp文件)

当运行ca->ConnectCOM(1, 1, 115200);时程序就出windows异常提示框,各位知道是什么原因吗?控件本身肯定是没问题的.
liangwei_2008 2009-04-02
  • 打赏
  • 举报
回复
1,如果想要用一个封装了A控件的dll,那么就需要建立这样的一个工程

2,你问的是不是mfc中dll的接口要怎么写
可以这样定义,最普通的
_declspec(dllimport) BOOL Methods();

3,CA如果是一个类,想定义一个对象可以这样写

CA ca ;//这样ca就是一个对象,就可以调用CA中的方法了

也可以这样写

CA *ca ; //定义指针
ca = NULL ; //初始化为空
ca = new CA ; //生成一个对象 并赋给指针

好运

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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