erisen 2005-11-17 11:33
求助:ASP组件问题
我首先贴一段别人成功实现的代码:
''对方的MSI软件我安装后,在注册表中它的DLL的CLSID
<OBJECT ID="o" CLASSID="CLSID:750AD907-AEFD-4B79-993E-601BED023C75" CODEBASE="http://www.movom.com/X.CAB#version=1,0,0,1" VIEWASTEXT>
</OBJECT>
''在页面中点了下载的一个图片后触发的事件
<SCRIPT LANGUAGE=VBScript FOR=down EVENT="onClick">
On Error Resume Next
if(o.AddJob("0001000000010000d7efb7b820c8abbcaf006674703a2f2f746b7a783a727771746d614036312e3132392e36362e37372fd7efb7b85fc8abbcaf2e726d766200") = false or o.Launch() = false) then
if (msgbox ("请下载客户端") = 1)then
window.open("http://www.movom.com/XSetup.msi")
end if
end if
If(Err.Number > 0) Then
End if
'location.reload()
</SCRIPT>
''出发下载的图片
<a href="#"><img name=down src="images/download_now.gif" width="97" height="35" border=0></a>
问题:
我也想实现这样的功能:在网页中点了一个图片,然后触发DLL中的事件,DLL中的事件调用了安装的软件,传一个值给软件,软件实现立即下载的功能,在下现在碰到的是,如何将DLL如何编写才可以实现调用软件及把值传给EXE软件?
在下一直做ASP,想在DLL,OCX方面扩展一下,请高手老大指点一二!!谢谢!!
Nothing 2005-11-17 12:42
首先在DLL中的函数AddJob,可以使用程序调用程序,同时将参数传给程序
比如你的程序的EXE文件是1.exe
那么你调用就可以了
"1.exe " + "传进来的参数"
同时,在1.exe 的启动入口,根据参数启动程序。
erisen 2005-11-17 13:26
感谢老大的回复,不过从DLL里启动程序是否用: shell 1.exe?还是有其他方法;在1.exe里如何设置来检查传入的参数.请老大明示,能有代码例子更好,谢谢!
Nothing 2005-11-17 15:16
我不知道你的程序是什么语言写的,不过程序传参数是很容易的事情。
不过可以使用API启动程序
WinExec("程序 参数",SW_SHOW);
注意程序和参数之间以空格分开。
如果你的程序是VB写的,请研究一下Command这个函数,如果是其他,请参考程序的入口处。
erisen 2005-11-17 16:17
谢谢,我是用VB+ASP写,在查Command这个函数。
erisen 2005-11-18 14:15
老大,在否,还是昨天的问题,我详细的看了command这个函数,能力有限,请老大举个例子明示一下,谢谢了先!
erisen 2005-11-18 14:58
我编写的DLL中包含一个AddJob函数,这个函数是使用winExec来调用那个EXE程序的,我把DLL注册了之后在网页中这样使用:
<OBJECT ID="o" CLASSID="CLSID:1F0C5C3C-EA69-407B-80B7-2360D99378EE" VIEWASTEXT>
</OBJECT>
<SCRIPT LANGUAGE=VBScript FOR=down EVENT="onClick">
if(o.AddJob("test") = false) then
if (msgbox ("请下载客户端") = 1)then
alert "Error"
end if
end if
If(Err.Number > 0) Then
End if
'location.reload()
</SCRIPT>
<input type=button value=Click name="down">
点了按钮之后IE弹出一个安全对话框,我点了“是”,但是没反应!好象DLL有个什么Safe接口,网上找到这个东西了,但确实针对OCX的,实在不知道如何编写可以不让IE那个安全对话框弹出来。请老大指点一二。
在下QQ:240916883,MSN:zhandoujif16@hotmail.com,如果老大方便请加我一下,直接请教!(可能会比较烦,加之前慎重,呵呵)
erisen 2005-11-18 15:43
老大,最新的问题:如何在一个EXE里编写可以接收参数,请指点!
erisen 2005-11-18 15:53
我写了SUB Main作为启动项,但提示没有SUB Main,就是说不能带参数,那么如何才可以传参数进去,请老大明示!
erisen 2005-11-18 18:30
前面的均解决了,我发现把问题写下来竟然可以更快解决,以后养成习惯,呵呵。
老大,最新问题,如何在一个DLL里写一个Safety Interface,因为我的DLL在网页中要执行一个函数,一执行IE就弹出一个安全对话框,我在网上找了资料了,这是正常的,解决方法是写一个Safety Interface,没接触过这东西,请老大指点一下;还有VB中的断点续传怎么做也请指点一二,谢谢了!
erisen 2005-11-21 16:07
在否老大,DLL的Safety Interface和VB的断点续传可以指点一二否,如果可以请明示如果在这方面没研究过指个路也行,谢了先!
来这里提问收获很大,以后会常来,希望可以做ASP版的版主,ASP问题都可以解决,请老大考虑一下,谢谢!
Nothing 2005-11-22 03:48
在VB中,不论在什么地方都可以使用Command的。
关于VB的安全编程,需要证书就可以了,不过因为是IE使用的,需在使用IE的验证,即需要使用证书,不过这个证书需要去MS买,挺贵的。
如果手动安装,VC道很容易实现,请看这个文档
http://www.lihuasoft.net/article/show.php?id=783
Nothing 2005-11-22 03:49
如何在VB中实现ActiveX控件的IobjectSafety接口
总述
本文叙述了如何在VB中实现控件的IobjectSafety接口,以标志该控件是脚本安全和初始化安全的。VB控件默认的处理方式是在注册表中注册组件类来标识其安全性,但实现IobjectSafety接口是更好的方法。本言语包括了实现过程中所需的所有代码。
请注意,控件只有确确实实是安全的,才能被标识为“安全的”。本文并未论及如何确保控件的安全性,这个问题请参阅Internet Client Software Development Kit (SDK)中的相关文档 "Safe Initialization and Scripting for ActiveX Controls",它在Component Development 栏目中。
相关信息:
<此处略去了一段也许无关紧要的警告>
现在开始循序渐进地举例说明怎样创建一个简单的VB控件,以及怎样将它标识为脚本安全和初始化安全。
首先新建一个文件夹来存放在本例中所产生的文件。
从VB CD-ROM取得OLE 自动化类库的制作工具。将VB安装光盘中CommonToolsVBUnsupprtTyplib目录下所有内容一并拷贝到前面新建的项目文件夹中。
把下列内容拷贝到“记事本”中,然后保存到上述文件夹,文件名为Objsafe.odl:
[
uuid(C67830E0-D11D-11cf-BD80-00AA00575603),
helpstring("VB IObjectSafety Interface"),
version(1.0)
]
library IObjectSafetyTLB
{
importlib("stdole2.tlb");
[
uuid(CB5BDC81-93C1-11cf-8F20-00805F2CD064),
helpstring("IObjectSafety Interface"),
odl
]
interface IObjectSafety:IUnknown {
[helpstring("GetInterfaceSafetyOptions")]
HRESULT GetInterfaceSafetyOptions(
[in] long riid,
[in] long *pdwSupportedOptions,
[in] long *pdwEnabledOptions);
[helpstring("SetInterfaceSafetyOptions")]
HRESULT SetInterfaceSafetyOptions(
[in] long riid,
[in] long dwOptionsSetMask,
[in] long dwEnabledOptions);
}
}
在命令行提示符下切换到项目文件夹,输入下列命令创建一个.tlb 文件:
MKTYPLIB objsafe.odl /tlb objsafe.tlb
在VB中新建一个ActiveX Control 项目。修改属性,把项目命名为IobjSafety,控件命名为DemoCtl。在控件上放置一个按钮,命名为cmdTest,在它的Click事件中加入一句代码 MsgBox "Test" 。
打开菜单“工程->引用”,点“浏览”,找到刚刚建立的Objsafe.tlb,把它加入到引用中。
增加一个新module名为basSafeCtl,并在其中加入下列代码:
Option Explicit
Public Const IID_IDispatch = "{00020400-0000-0000-C000-000000000046}"
Public Const IID_IPersistStorage = _
"{0000010A-0000-0000-C000-000000000046}"
Public Const IID_IPersistStream = _
"{00000109-0000-0000-C000-000000000046}"
Public Const IID_IPersistPropertyBag = _
"{37D84F60-42CB-11CE-8135-00AA004BB851}"
Public Const INTERFACESAFE_FOR_UNTRUSTED_CALLER = &H1
Public Const INTERFACESAFE_FOR_UNTRUSTED_DATA = &H2
Public Const E_NOINTERFACE = &H80004002
Public Const E_FAIL = &H80004005
Public Const MAX_GUIDLEN = 40
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
(pDest As Any, pSource As Any, ByVal ByteLen As Long)
Public Declare Function StringFromGUID2 Lib "ole32.dll" (rguid As _
Any, ByVal lpstrClsId As Long, ByVal cbMax As Integer) As Long
Public Type udtGUID
Data1 As Long
Data2 As Integer
Data3 As Integer
Data4(7) As Byte
End Type
Public m_fSafeForScripting As Boolean
Public m_fSafeForInitializing As Boolean
Sub Main()
m_fSafeForScripting = True
m_fSafeForInitializing = True
End Sub
在工程属性中把启动对象改成Sub Main确保上述代码会被执行。m_fSafeForScripting 和m_fSafeForInitializing两件变量的值分别指定了脚本安全和初始化安全取值。
打开控件代码窗口,在声明部分加入如下代码(如果有Option Explicit语句,当然要保证代码放在其后):
Implements IObjectSafety
把下面两个过程代码拷贝到控件代码中:
Private Sub IObjectSafety_GetInterfaceSafetyOptions(ByVal riid As _
Long, pdwSupportedOptions As Long, pdwEnabledOptions As Long)
Dim Rc As Long
Dim rClsId As udtGUID
Dim IID As String
Dim bIID() As Byte
pdwSupportedOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER Or _
INTERFACESAFE_FOR_UNTRUSTED_DATA
If (riid <> 0) Then
CopyMemory rClsId, ByVal riid, Len(rClsId)
bIID = String$(MAX_GUIDLEN, 0)
Rc = StringFromGUID2(rClsId, VarPtr(bIID(0)), MAX_GUIDLEN)
Rc = InStr(1, bIID, vbNullChar) - 1
IID = Left$(UCase(bIID), Rc)
Select Case IID
Case IID_IDispatch
pdwEnabledOptions = IIf(m_fSafeForScripting, _
INTERFACESAFE_FOR_UNTRUSTED_CALLER, 0)
Exit Sub
Case IID_IPersistStorage, IID_IPersistStream, _
IID_IPersistPropertyBag
pdwEnabledOptions = IIf(m_fSafeForInitializing, _
INTERFACESAFE_FOR_UNTRUSTED_DATA, 0)
Exit Sub
Case Else
Err.Raise E_NOINTERFACE
Exit Sub
End Select
End If
End Sub
Private Sub IObjectSafety_SetInterfaceSafetyOptions(ByVal riid As _
Long, ByVal dwOptionsSetMask As Long, ByVal dwEnabledOptions As Long)
Dim Rc As Long
Dim rClsId As udtGUID
Dim IID As String
Dim bIID() As Byte
If (riid <> 0) Then
CopyMemory rClsId, ByVal riid, Len(rClsId)
bIID = String$(MAX_GUIDLEN, 0)
Rc = StringFromGUID2(rClsId, VarPtr(bIID(0)), MAX_GUIDLEN)
Rc = InStr(1, bIID, vbNullChar) - 1
IID = Left$(UCase(bIID), Rc)
Select Case IID
Case IID_IDispatch
If ((dwEnabledOptions And dwOptionsSetMask) <> _
INTERFACESAFE_FOR_UNTRUSTED_CALLER) Then
Err.Raise E_FAIL
Exit Sub
Else
If Not m_fSafeForScripting Then
Err.Raise E_FAIL
End If
Exit Sub
End If
Case IID_IPersistStorage, IID_IPersistStream, _
IID_IPersistPropertyBag
If ((dwEnabledOptions And dwOptionsSetMask) <> _
INTERFACESAFE_FOR_UNTRUSTED_DATA) Then
Err.Raise E_FAIL
Exit Sub
Else
If Not m_fSafeForInitializing Then
Err.Raise E_FAIL
End If
Exit Sub
End If
Case Else
Err.Raise E_NOINTERFACE
Exit Sub
End Select
End If
End Sub
保存后,把工程编译成OCX文件。现在控件已经实现了IObjectSafety 接口。在.htm中加入这件控件试一试吧。
erisen 2005-11-22 19:13
谢谢,不过这个IObjectSafety 好象是OCX控件用的,对DLL是否管用我测试过,没成功!还有,VB中用AsyncRead来传输数据如何实现断点续传呢,一直没找到合适的方法。
erisen 2005-11-22 20:27
最新进展,通过两次测试,解决了那个安全对话框的问题。现在是断点续传的问题了。
erisen 2005-11-23 13:59
安全对话框的问题已经解决,那个IObjectSafety不仅仅是对OCX起作用对DLL也一样有用。谢谢老大!
现在还有一个如何实现asyncRead函数的断点续传问题,网上的讨论很多,却没有一个解决方法,请老大指点一二。
erisen 2005-11-24 15:30
在吗老大,断点续传如何实现,请老大给个提示!谢谢了先!麻烦啊这个网络传输的软件。