web中无法调用ActiveX中的函数

develop_game 2010-03-25 02:44:37
发现在windows mobile下无法调用ActiveX中的函数, 测试例子比较简单, 就是直接返回一个数值,


 

--------------------------------------------------------------------------------
.H
--------------------------------------------------------------------------------

// GPSReader.h : Declaration of the CGPSReader
...

class ATL_NO_VTABLE CGPSReader :
public IObjectSafetyImpl<CGPSReader, INTERFACESAFE_FOR_UNTRUSTED_CALLER| INTERFACESAFE_FOR_UNTRUSTED_DATA>,
public CComObjectRootEx<CComMultiThreadModel>,
public CComCoClass<CGPSReader, &CLSID_GPSReader>,
public IConnectionPointContainerImpl<CGPSReader>,
public CProxy_IGPSReaderEvents<CGPSReader>,
public IObjectWithSiteImpl<CGPSReader>,
public IDispatchImpl<IGPSReader, &IID_IGPSReader, &LIBID_GPSLib, /*wMajor =*/ 1, /*wMinor =*/ 0>
{
public:
CGPSReader()
{
}

#ifndef _CE_DCOM
DECLARE_REGISTRY_RESOURCEID(IDR_GPSREADER)
#endif

BEGIN_COM_MAP(CGPSReader)
COM_INTERFACE_ENTRY(IGPSReader)
COM_INTERFACE_ENTRY(IDispatch)
COM_INTERFACE_ENTRY(IConnectionPointContainer)
COM_INTERFACE_ENTRY(IObjectWithSite)
COM_INTERFACE_ENTRY(IObjectSafety)
END_COM_MAP()

BEGIN_CONNECTION_POINT_MAP(CGPSReader)
CONNECTION_POINT_ENTRY(__uuidof(_IGPSReaderEvents))
END_CONNECTION_POINT_MAP()


DECLARE_PROTECT_FINAL_CONSTRUCT()

HRESULT FinalConstruct()
{
return S_OK;
}

void FinalRelease()
{
}

public:

STDMETHOD(GetGPSinfo)(LONG * m_gpsInfo); //对外的函数
};

OBJECT_ENTRY_AUTO(__uuidof(GPSReader), CGPSReader)

--------------------------------------------------------------------------------
CPP
--------------------------------------------------------------------------------

// GPSReader.cpp : Implementation of CGPSReader

#include "stdafx.h"
#include "GPSReader.h"

STDMETHODIMP CGPSReader::GetGPSinfo(LONG * m_gpsInfo) //直接赋值就返回了
{
// TODO: Add your implementation code here

*m_gpsInfo = 1;

return S_OK;
}

--------------------------------------------------------------------------------
HTML文件
--------------------------------------------------------------------------------

<HTML>
<HEAD>

<TITLE>GPS Test</TITLE>

<OBJECT
ID="GPS"
CLASSID="clsid:53A7AFB1-E3EE-4D7A-90BF-3D466B12A4ED"
WIDTH=0
HEIGHT=0
>
</OBJECT>

<script language="javascript">
function doTest()
{
alert("Start...");
var sum = GPS.GetGPSinfo(); //到了这里就无法运行了
alert(sum);
}
</script>

</HEAD>

<BODY>
<input type="button" value="TestGPS" id="btnOK" onclick="doTest()"></input>
</BODY>
</HTML>


--------------------------------------------------------------------------------
IDL文件
--------------------------------------------------------------------------------

...
library GPSLib
{
importlib("stdole2.tlb");
interface IDocHostUIHandlerDispatch;
interface IAxWinAmbientDispatchEx;
[
uuid(53A7AFB1-E3EE-4D7A-90BF-3D466B12A4ED), //HTM中用的是这个ID
helpstring("_IGPSReaderEvents Interface")
]
dispinterface _IGPSReaderEvents
{
properties:
methods:
};
[
uuid(121573D2-480D-468C-ADB5-2935B440523E),
helpstring("GPSReader Class")
]
coclass GPSReader
{
[default] interface IGPSReader;
[default, source] dispinterface _IGPSReaderEvents;
};
};

...全文
177 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
JasonBUG 2012-03-17
  • 打赏
  • 举报
回复
Thanks a lot!
Acolor86 2010-03-28
  • 打赏
  • 举报
回复
初始化控件对象,再通过对象调用对象的接口函数。
develop_game 2010-03-26
  • 打赏
  • 举报
回复
<OBJECT
ID="GPS"
CLASSID="clsid:53A7AFB1-E3EE-4D7A-90BF-3D466B12A4ED"
WIDTH=0
HEIGHT=0
>
</OBJECT>


改成

var ret = new ActiveXObject("AXSample.AXSampleCtl");

就行了。。。没搞懂
gw_net 2010-03-25
  • 打赏
  • 举报
回复
用windbg,attach IE来调试,要配symbol server
sgzwiz 2010-03-25
  • 打赏
  • 举报
回复
下断点自己调试了
develop_game 2010-03-25
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 sgzwiz 的回复:]
idl中未声明IGPSReader接口和GetGPSinfo函数,浏览器当然找不到这个函数了
[/Quote]

不好意思没贴全.


// GPS.idl : IDL source for GPS
//

// This file will be processed by the MIDL tool to
// produce the type library (GPS.tlb) and marshalling code.

import "oaidl.idl";
import "ocidl.idl";

[
object,
uuid(454F78B0-086F-4B81-88DD-55E43A6009F4),
dual,
nonextensible,
helpstring("IGPSReader Interface"),
pointer_default(unique)
]
interface IGPSReader : IDispatch{
[id(1), helpstring("method GetGPSinfo")]
HRESULT GetGPSinfo( [out,retval] LONG * m_gpsInfo);
};
[
uuid(C9C53C58-3B3D-4A9B-8ED1-88FCFB5942C8),
version(1.0),
helpstring("GPS 1.0 Type Library")
]
library GPSLib
{
importlib("stdole2.tlb");
interface IDocHostUIHandlerDispatch;
interface IAxWinAmbientDispatchEx;
[
uuid(53A7AFB1-E3EE-4D7A-90BF-3D466B12A4ED),
helpstring("_IGPSReaderEvents Interface")
]
dispinterface _IGPSReaderEvents
{
properties:
methods:
};
[
uuid(121573D2-480D-468C-ADB5-2935B440523E),
helpstring("GPSReader Class")
]
coclass GPSReader
{
[default] interface IGPSReader;
[default, source] dispinterface _IGPSReaderEvents;
};
};
develop_game 2010-03-25
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 sgzwiz 的回复:]
idl中未声明IGPSReader接口和GetGPSinfo函数,浏览器当然找不到这个函数了
[/Quote]

不好意思没贴全.


// GPS.idl : IDL source for GPS
//

// This file will be processed by the MIDL tool to
// produce the type library (GPS.tlb) and marshalling code.

import "oaidl.idl";
import "ocidl.idl";

[
object,
uuid(454F78B0-086F-4B81-88DD-55E43A6009F4),
dual,
nonextensible,
helpstring("IGPSReader Interface"),
pointer_default(unique)
]
interface IGPSReader : IDispatch{
[id(1), helpstring("method GetGPSinfo")]
HRESULT GetGPSinfo( [out,retval] LONG * m_gpsInfo);
};
[
uuid(C9C53C58-3B3D-4A9B-8ED1-88FCFB5942C8),
version(1.0),
helpstring("GPS 1.0 Type Library")
]
library GPSLib
{
importlib("stdole2.tlb");
interface IDocHostUIHandlerDispatch;
interface IAxWinAmbientDispatchEx;
[
uuid(53A7AFB1-E3EE-4D7A-90BF-3D466B12A4ED),
helpstring("_IGPSReaderEvents Interface")
]
dispinterface _IGPSReaderEvents
{
properties:
methods:
};
[
uuid(121573D2-480D-468C-ADB5-2935B440523E),
helpstring("GPSReader Class")
]
coclass GPSReader
{
[default] interface IGPSReader;
[default, source] dispinterface _IGPSReaderEvents;
};
};
sgzwiz 2010-03-25
  • 打赏
  • 举报
回复
idl中未声明IGPSReader接口和GetGPSinfo函数,浏览器当然找不到这个函数了
develop_game 2010-03-25
  • 打赏
  • 举报
回复
我在windows mobile IE 上可以显示那个按钮的, 按下去后没有反应也没有报错


[Quote=引用 4 楼 bobob 的回复:]
先看ie报什么 错误?参数不匹配?接口不对?
[/Quote]
develop_game 2010-03-25
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 sgzwiz 的回复:]
在DllGetClassObject函数里下断点,然后单步调试,看看哪里有问题
[/Quote]

设了断点只跑了一步就停了,显示对话框"No symbols are loaded for any call stack frame. The source code cannot be displayed."
bobob 2010-03-25
  • 打赏
  • 举报
回复
先看ie报什么 错误?参数不匹配?接口不对?
sgzwiz 2010-03-25
  • 打赏
  • 举报
回复
在DllGetClassObject函数里下断点,然后单步调试,看看哪里有问题
develop_game 2010-03-25
  • 打赏
  • 举报
回复
这个也试过了, 还是没有执行到那一步, 弱问除了这几个文件还有其他地方需要编写代码的吗?

[Quote=引用 1 楼 sgzwiz 的回复:]
C/C++ code
CLASSID="clsid:53A7AFB1-E3EE-4D7A-90BF-3D466B12A4ED"

clsid错了,
换成coclass GPSReader的uuid(121573D2-480D-468C-ADB5-2935B440523E)。
[/Quote]
sgzwiz 2010-03-25
  • 打赏
  • 举报
回复
CLASSID="clsid:53A7AFB1-E3EE-4D7A-90BF-3D466B12A4ED"

clsid错了,
换成coclass GPSReader的uuid(121573D2-480D-468C-ADB5-2935B440523E)。

3,245

社区成员

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

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