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

来源:互联网  时间:2016/8/23 0:06:07

关于网友提出的“ VS2010建立了MFC AxtiveX工程报错,JS调用Axtivex不成功”问题疑问,本网通过在网上对“ VS2010建立了MFC AxtiveX工程报错,JS调用Axtivex不成功”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:

问题: VS2010建立了MFC AxtiveX工程报错,JS调用Axtivex不成功
描述:

本帖最后由 xue251248603 于 2014-05-15 11:08:57 编辑

visual studioactivexvs2010插件object

近期需要开发一个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 
#include 
[ 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”属性或方法 ”,调用代码也贴出来吧。
<>
CODEBASE="H:\learn\C#Project\activeXtest\Debug\activeXtest.ocx">
var a = document.getElementById("OCX");
b = a.Test01();
主要纠结于问题2,然后想到了是不是因为问题1导致的问题2?
有看到过要用IDispatch接口,由于进入不了.h问题,不清楚 dispinterface 类型是不是他们所说得IDispatch类型。
小弟新手,还望大神详细指教
解决方案1:

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 
#include 
[ 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文件里面看看接口的定义

上一篇使用COleDataSource处理拖放,拖放过程中的图像,怎么弄
下一篇关于MSCOMM控件的问题
明星图片
相关文章
《 VS2010建立了MFC AxtiveX工程报错,JS调用Axtivex不成功》由码蚁之家搜集整理于网络,
联系邮箱:mxgf168#qq.com(#改为@)