我有一个使用ATL创建的COM对象(没有MFC支持)
Object有一个方法可以打开一个Dialog(完成所有其余的操作)
目前我从另一个EXE呼叫它:
hr = CoCreateInstance(
CLSID_MyControl,
NULL,
CLSCTX_INPROC_SERVER,
IID_IMyControl,
(void**) &pMyControl
);
然后:
hr = pMyControl->MyMethod (ATL::CComBSTR(InputString1), ATL::CComBSTR(InputString2), &IntReturned, &IntReturned);
是否可以从浏览器中调用它?
如何实例化对象并从浏览器调用我的方法(使用params)?
答案 0 :(得分:3)
回答你问题的一些要点:
除了IE或基于WebBrowser的应用程序之外,您将无法在任何浏览器中使用COM对象。
您需要实现IObjectSafety接口以允许IE创建您的对象。当然,对象应该是任何不受信任的源脚本安全的。理想情况下,您应该lock the object到您自己的网站列表。您可以使用SiteLock模板。
该对象应实现IDispatch
接口,以供脚本使用。最好的方法是使用ATL的IDispatchImpl
(很有可能,它已经在您的代码中完成)。
示例中的MyMethod
使用[out]
的两个IntReturned
参数。 JavaScript只允许一个输出[out, retval]
参数。如果需要返回多个值,则必须使用VBScript。
示例(替换您的CLSID):
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "">
<html>
<head>
<title></title>
<script type="text/vbscript">
Option Explicit
window.onload = GetRef("OnLoadHandler")
Sub OnLoadHandler
Dim InputString1
Dim InputString2
Dim IntReturned1
Dim IntReturned2
InputString1 = "a"
InputString1 = "b"
testObject.MyMethod InputString1, InputString2, IntReturned1, IntReturned
alert "Result: " & IntReturned1 & ", " & IntReturned
End Sub
</script>
</head>
<body>
<object id="testObject" classid="clsid:12345678-1234-1234-1234-1234567890AB">
<span>Unable to create the object.</span>
</object>
</body>
</html>
如果您没有实现IObjectSafety
,您仍然可以将此代码作为HTML应用程序运行。将其另存为.HTA文件,如果C ++ COM DLL为32位,则运行为C:\Windows\SysWOW64\mshta.exe C:\users\user\Documents\test.hta
;如果为64位,则运行为C:\Windows\System32\mshta.exe C:\users\user\Documents\test.hta
。
需要首先使用regsvr32.exe
注册COM DLL(如果可以从C ++客户端项目中使用它,则可能已经完成了此操作。)