0

几天来一直在尝试,无法弄清楚这一点。我为 Intranet 应用程序编写了一个 C# 类文件来控制本地串行端口。当我使用 regasm 手动注册 dll 时效果很好,但是,我需要从网页部署此控件而无需手动注册。我尝试在 Visual Studio 2010 中创建一个安装项目,它编译得很好,但我无法在网页中打开该对象。

以下是我的 C# 类中的相关代码行:

namespace wmsSerialPorts
{
[Guid("55D31498-12A5-4FF0-942D-3B0BA449CA7B")]
    [InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
    [ComVisible(true)]
      public interface iAxDevices
    {
        [DispId(1)]
        int OpenPort(string sComPort);
        [DispId(2)]
        int ClosePort();
        [DispId(3)]
        int SendCmd(string sCmd);
        [DispId(4)]
        string GetLastError();
        //[DispId(5)]
        //string ReadLine();
        [DispId(6)]
        string ReadWeight();
        [DispId(7)]
        Microsoft.JScript.ArrayObject GetJsPorts();
        [DispId(8)]
        void prtLabel(string sItemNum, string sQty, string sDesc, string sWoNum, string sBoxID, string sBoxIDBarCode, string sBoxIDorig);
        [DispId(9)]
        void prtLabelQC(string sItemNum, string sQty, string sDesc, string sWoNum, string sBoxID, string sBoxIDBarCode, string sBoxIDorig, string sNeedDate, string sRecOverride);
        [DispId(10)]
        void prtReset();
    }

[Guid("E59C5B7E-EF1F-4241-A9FD-191EF8FCC167")]
    [ClassInterface(ClassInterfaceType.None)]
    [ComVisible(true)]
    [ProgId("AxDevices")]
    public class AXDevices : wmsSerialPorts.SerialCom, iAxDevices, wmsSerialPorts.IObjectSafety

正如我所提到的,如果我使用 regasm wmsSerialPorts.dll,从 JavaScript 调用该对象时效果很好,如下所示:

myAx = new ActiveXObject("AXDevices");

我的安装项目包含一个 wmsSerialPorts.inf 文件:

[version]

signature="$CHICAGO$"

AdvancedINF=2.0

[Setup Hooks]

install=install

[install]

run=msiexec.exe /package """%EXTRACT_DIR%\ActiveXSetup.msi""" /qn

.... 和一个 ActiveXBuild.ddf 文件:

.Set DiskDirectoryTemplate=cab

.Set CabinetNameTemplate=ActiveXSetup.cab

Debug\ActiveXSetup.msi

wmsSerialPorts.inf

我的 wmsSerialPorts.dll 文件被正确引用为分离的程序集,并且构建安装项目按预期创建了 ActiveXSetup.cab 和 ActiveXSetup.msi 文件。

然后我创建了这个 HTML 页面来加载对象:

<!DOCTYPE>
<html>
<head>
    <title>Test</title>
</head>
<body>
<!--    <object id="AXDevices" classid="clsid:E59C5B7E-EF1F-4241-A9FD-191EF8FCC167" codebase="https://10.0.2.53/BIDWMS/ActiveXSetup.cab">
    </object>-->
        <object id="AXDevices" classid="clsid:E59C5B7E-EF1F-4241-A9FD-191EF8FCC167" codebase="ActiveXSetup.cab">
    </object>
    <script type="text/javascript">
        try {
            var obj = document.AXDevices;
            if (obj) {
                alert(obj.SayHello());
            } else {
                alert("Object is not created!");
            }
        } catch (ex) {
            alert("Error message is: " + ex.Description);
        }
    </script>
</body>
</html>

...但是当我运行该页面时,它会生成“未定义”错误(来自 catch(ex) 块)。有任何想法吗?在此先感谢.......鲍勃

4

1 回答 1

0

您的代码库必须是 url,而不仅仅是文件名。如果您的文件在 C:\inetpub\myCabFiles\ActiveXSetup.cab 中,并且您的网站在 C:\inetpub 中,那么代码库应该类似于

codebase="www.mywebsite.com\myCabFiles\ActiveXSetup.cab"
于 2012-09-06T19:14:54.493 回答