VS2010建立了MFC AxtiveX工程报错,JS调用Axtivex不成功

xue251248603 2014-05-15 11:06:37
近期需要开发一个ActiveX控件,用VS2010建立了MFC AxtiveX工程(工程名 activeXtest.),建立后有许多错误,相继调整了一些配置:
1、属性 --> 配置属性 --> C/C++ --> 代码生成 --> 运行库 改为 “多线程DLL(MD)”;
2、属性 --> 配置属性 --> 常规 --> MFC的使用 改为 “在共享 DLL 中使用 MFC”。

调整2是因为如下报错:
错误 1 error C1189: #error : Building MFC application with /MD[d] (CRT dll version) requires MFC shared dll version. Please #define _AFXDLL or do not use /MD[d] d:\program files (x86)\microsoft visual studio 10.0\vc\atlmfc\include\afx.h 24 1 activeXtest

--------------------------------背景交代完毕----------------------------------------

问题1:
但是每次打开 activeXtest.h 文件后VS会崩溃。

VS停止运行报错:
问题签名:
  问题事件名称: CLR20r3
  问题签名 01: devenv.exe
  问题签名 02: 10.0.30319.1
  问题签名 03: 4ba1fab3
  问题签名 04: Microsoft.VisualStudio.Text.Data
  问题签名 05: 10.0.0.0
  问题签名 06: 4ba1d707
  问题签名 07: 1d6
  问题签名 08: 52
  问题签名 09: System.ArgumentOutOfRange
  OS 版本: 6.1.7601.2.1.0.256.1
  区域设置 ID: 2052

----------------------------割一下-------------------------------------

问题2:
然后通过向导添加了方法:Test01() 接口,返回字符串 “test01”,代码如下:
activeXtest.idl

#include <olectl.h>
#include <idispids.h>

[ uuid(35AEE76F-5CD3-4404-9FAB-C561D6A7990D), version(1.0),
control ]
library activeXtestLib
{
importlib(STDOLE_TLB);

// CactiveXtestCtrl 的主调度接口
[
uuid(28E74985-74AD-4F11-91C2-72BE1ADB99A8)
]
dispinterface _DactiveXtest
{
properties:
methods:

[id(DISPID_ABOUTBOX)] void AboutBox();
[id(1)] BSTR Test01(void);
};

// CactiveXtestCtrl 的事件调度接口

[
uuid(A044456C-B9FE-4FD2-827D-2BFB6A88BF12)
]
dispinterface _DactiveXtestEvents
{
properties:
// 事件接口没有任何属性

methods:
[id(1)] BSTR Test02(void);
};

// CactiveXtestCtrl 的类信息
[
uuid(B795F2A0-E31F-461D-833A-1E88130E2939)
]
coclass activeXtest
{
[default] dispinterface _DactiveXtest;
[default, source] dispinterface _DactiveXtestEvents;
};

};


activeXtestCtrl.cpp中代码

BSTR CactiveXtestCtrl::Test01(void)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());

CString strResult;

// TODO: 在此添加调度处理程序代码
strResult = L"test01";
return strResult.AllocSysString();
}


用regsvr32注册插件
然后用 ..\Program Files (x86)\Microsoft Visual Studio 10.0\Samples\2052\C++\MFC\ole\TstCon\Debug\TstCon.exe 测试Test01()接口返回值显示为: test01 (VT_BSTR),正确

可是在js中调用时报错,提示“对象不支持“Test01”属性或方法 ”,调用代码也贴出来吧。
<OBJECT ID="OCX" WIDTH=528 HEIGHT=545 classid="B795F2A0-E31F-461D-833A-1E88130E2939"
CODEBASE="H:\learn\C#Project\activeXtest\Debug\activeXtest.ocx">

var a = document.getElementById("OCX");
b = a.Test01();

主要纠结于问题2,然后想到了是不是因为问题1导致的问题2?
有看到过要用IDispatch接口,由于进入不了.h问题,不清楚 dispinterface 类型是不是他们所说得IDispatch类型。

小弟新手,还望大神详细指教
...全文
139 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
lis2012 2014-05-15
  • 打赏
  • 举报
回复
[quote=引用 楼主 xue251248603 的回复:] 近期需要开发一个ActiveX控件,用VS2010建立了MFC AxtiveX工程(工程名 activeXtest.),建立后有许多错误,相继调整了一些配置: 1、属性 --> 配置属性 --> C/C++ --> 代码生成 --> 运行库 改为 “多线程DLL(MD)”; 2、属性 --> 配置属性 --> 常规 --> MFC的使用 改为 “在共享 DLL 中使用 MFC”。 调整2是因为如下报错: 错误 1 error C1189: #error : Building MFC application with /MD[d] (CRT dll version) requires MFC shared dll version. Please #define _AFXDLL or do not use /MD[d] d:\program files (x86)\microsoft visual studio 10.0\vc\atlmfc\include\afx.h 24 1 activeXtest --------------------------------背景交代完毕---------------------------------------- 问题1: 但是每次打开 activeXtest.h 文件后VS会崩溃。 VS停止运行报错: 问题签名:   问题事件名称: CLR20r3   问题签名 01: devenv.exe   问题签名 02: 10.0.30319.1   问题签名 03: 4ba1fab3   问题签名 04: Microsoft.VisualStudio.Text.Data   问题签名 05: 10.0.0.0   问题签名 06: 4ba1d707   问题签名 07: 1d6   问题签名 08: 52   问题签名 09: System.ArgumentOutOfRange   OS 版本: 6.1.7601.2.1.0.256.1   区域设置 ID: 2052 ----------------------------割一下------------------------------------- 问题2: 然后通过向导添加了方法:Test01() 接口,返回字符串 “test01”,代码如下: activeXtest.idl

#include <olectl.h>
#include <idispids.h>

[ uuid(35AEE76F-5CD3-4404-9FAB-C561D6A7990D), version(1.0),
  control ]
library activeXtestLib
{
	importlib(STDOLE_TLB);

	//  CactiveXtestCtrl 的主调度接口
	[ 
		uuid(28E74985-74AD-4F11-91C2-72BE1ADB99A8)	
	]
	dispinterface _DactiveXtest
	{
		properties:
		methods:

			[id(DISPID_ABOUTBOX)] void AboutBox();
			[id(1)] BSTR Test01(void);
	};

	//  CactiveXtestCtrl 的事件调度接口

	[ 
		uuid(A044456C-B9FE-4FD2-827D-2BFB6A88BF12)	
	]
	dispinterface _DactiveXtestEvents
	{
		properties:
			//  事件接口没有任何属性

		methods:
			[id(1)] BSTR Test02(void);
	};

	//  CactiveXtestCtrl 的类信息
	[
		uuid(B795F2A0-E31F-461D-833A-1E88130E2939)
	]
	coclass activeXtest
	{
		[default] dispinterface _DactiveXtest;
		[default, source] dispinterface _DactiveXtestEvents;
	};

};
activeXtestCtrl.cpp中代码

BSTR CactiveXtestCtrl::Test01(void)
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState());

	CString strResult;

	// TODO: 在此添加调度处理程序代码
	strResult = L"test01";
	return strResult.AllocSysString();
}
有看到过要用IDispatch接口,由于进入不了.h问题,不清楚 dispinterface 类型是不是他们所说得IDispatch类型。 这个问题,到idl文件里面看看接口的定义
xue251248603 2014-05-15
  • 打赏
  • 举报
回复
感觉上面说的有点乱,理一下: 问题1是:用VS2010按照向导建立了MFC AxtiveX工程(工程名 activeXtest.),在“解决方案资源管理器”中双击打开activeXtest.h文件后,VS会停止运行。
xue251248603 2014-05-15
  • 打赏
  • 举报
回复
无法调用的问题解决了,哎,自己太粗心了,丢失了红色部分。 <OBJECT ID="OCT" WIDTH=528 HEIGHT=545 classid="CLSID:9EE6F639-9EB8-4273-8E2B-65F9846F7F4D" CODEBASE="ocxTest.CAB#version=1.0.0"></OBJECT> 不过在“解决方案资源管理器”中双击打开activeXtest.h文件后,VS会停止运行 这个问题哪位大神解答一下啊
xue251248603 2014-05-15
  • 打赏
  • 举报
回复
引用 2 楼 lis2012 的回复:
这个问题,到idl文件里面看看接口的定义
idl文件贴出来了,定义在这里: library activeXtestLib { importlib(STDOLE_TLB); // CactiveXtestCtrl 的主调度接口 [ uuid(28E74985-74AD-4F11-91C2-72BE1ADB99A8) ] dispinterface _DactiveXtest { properties: methods: [id(DISPID_ABOUTBOX)] void AboutBox(); [id(1)] BSTR Test01(void); };

3,248

社区成员

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

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