Board logo

标题: 求助:ASP组件问题 [打印本页]

作者: 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里如何设置来检查传入的参数.请老大明示,能有代码例子更好,谢谢!
作者: erisen    时间: 2005-11-17 14:18

请老大明示!!
作者: 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

在吗老大,断点续传如何实现,请老大给个提示!谢谢了先!麻烦啊这个网络传输的软件。




欢迎光临 编程开发论坛 (http://bbs.lihuasoft.net/) Powered by Discuz! 6.0.0