【问题标题】:accessing Resource in ACTIVEX DLL from aspx page从 aspx 页面访问 ACTIVEX DLL 中的资源
【发布时间】:2011-04-19 00:53:44
【问题描述】:

我有一个用 vb6 编写的 activeX dll。在该代码中,它使用LoadResPicture() 加载图像,然后将其发送到打印机(使用PaintPicture

如果我使用托管在运行 IIS 7.0 的 Windows 2008 机器上的 ASPX 页面调用此 DLL,则不会打印图像。

如果我在同一台服务器上使用 VBS 脚本调用此 DLL,则图像可以正常打印。

当 aspx 页面托管在 Windows 2000 Server 上时,该图像可以正常打印。

这是 VBS 代码:

Dim CheckCtl
set CheckCtl = CreateObject("CHECKCONTROL.CHECK")

CheckCtl.FBOAccountID = 2765
CheckCtl.includesignature = True
CheckCtl.Amount = 500.00
CheckCtl.CheckDate = #04/06/2011#
CheckCtl.Payee_L1 = "Donald Trump"
CheckCtl.Payee_L2 = "10 Park Place"
CheckCtl.Payee_L3 = "Atlantic City, NJ 00011"
CheckCtl.Payee_L4 = ""
CheckCtl.Notes = "This is a test check"
CheckCtl.SubmittedBy = "Accountant"

dim lSuccess
lSuccess = CheckCtl.Printcheck()

这是 ASPX VB.NET 代码:

Dim CheckCtl As checkcontrolNET.Check
CheckCtl = New checkcontrolNET.Check
CheckCtl.FBOAccountId = 2765
CheckCtl.IncludeSignature = True
CheckCtl.Amount = 500.0
CheckCtl.CheckDate = "04/06/2011"
CheckCtl.Payee_L1 = "Donald Trump"
CheckCtl.Payee_L2 = "10 Park Place"
CheckCtl.Payee_L3 = "Atlantic City, NJ 00011"
CheckCtl.Payee_L4 = ""
CheckCtl.notes = "This is a test check"
CheckCtl.SubmittedBy = "Accountant"

Dim lSuccess As Boolean
lSuccess = CheckCtl.printcheck()
Response.Write(lSuccess)

我错过了什么?

【问题讨论】:

    标签: asp.net iis vb6 activex


    【解决方案1】:

    你的服务器是 64 位的吗?根据 MSDN,该功能的 .Net 版本仅支持 32 位版本,因此 VB6 版本可能也是如此。

    http://msdn.microsoft.com/en-us/library/ms652936.aspx

    【讨论】:

    • 服务器是 32 位的。当我通过命令行 vbs 脚本运行它时,它在该服务器上也运行良好。
    • 抱歉,我错过了 VBS 部分。我将倾向于@Kev 关于权限的说法。在服务器上运行命令dcomcnfg,它将打开组件服务管理器。提示打开“控制台根目录”、“组件服务”、“计算机”、“我的电脑”、“DCOM 配置”并在其中查找您的组件。右键单击它,选择属性并转到安全选项卡。您可能需要更改前两个中的一个或两个,添加运行您的应用程序池的安全帐户。
    • 我没有看到它在 DCOM 配置下列出。是否会按 guid 列出?
    • 有可能。你regsvr32 DLL 了吗?
    • 已注册。如果不是,它将无法通过 VBS 脚本运行。
    【解决方案2】:

    我发现带有 IIS 的 VB ActiveX 的 COM+ 方法很奇怪。我希望您可以控制 VB6 Dlls 代码,如果可以,请尝试将此代码放入您尝试实例化的 VB6 类中。

    Private moScriptCtx As ScriptingContext
    
    Public Sub OnStartPage(SC As ScriptingContext)
    
        Set moScriptCtx = SC
    
    End Sub
    

    您现在可以访问请求、响应、服务器等作为 moScriptCtx 对象的属性。在 CreateObject 执行期间,ASP 会自动为您调用 OnStartPage()

    [编辑]

    如果您不使用 ASP 的内在属性,这可能对您没有用处,但请尝试在 COM+ 管理控制台上启用它。

    Fire up the COM+ management consoleo    
    Find the COM+ Application in questiono    
    Find the applicable component in the 'Components' folder
    Right click on it and choose properties
    Select the Advanced tab
    Check the 'Allow IIS Intrinsic Properties' checkbox
    

    http://blogs.msdn.com/b/distributedservices/archive/2010/04/28/iis-intrinsic-properties-are-disabled-by-default-on-windows-2008-and-windows-2008-r2.aspx

    【讨论】:

    • 为什么我需要访问此控件中的请求、响应或服务器对象?这将如何解决我的问题?
    • 你的 LoadResPicture() 方法是做什么的?您也可以发布该代码吗?
    【解决方案3】:

    这听起来有点像权限问题。我怀疑您的 Windows 2000 服务器在 SYSTEM 帐户下运行 IIS,并且可能与旧的 ASPNET 工作进程帐户相同。

    检查运行该站点的帐户是否具有打印权限。根据您保护网站的方式,这可能是以下任何一种:

    • 应用程序池标识
    • 特定的匿名帐户
    • IUSR 帐户

    【讨论】:

    • 我正在针对经典 .NET 应用程序池运行。在应用程序池在身份下显示 NETWORKSERVICE 的高级属性下。这是否意味着我需要授予 networkService 对 CheckControl.dll 文件的读取权限?
    • @aheho - 你有没有抛出异常?
    • 没有。就好像 loadResPicture 调用和下面的paintpicture 被忽略了。表单上的其他所有内容都打印正常。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-28
    • 1970-01-01
    • 1970-01-01
    • 2013-11-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多