现有一个ocx控件,目的是取IE客户端机器的MAC物理地址或(硬盘号\CPU号等,反正就是要取客户机上的硬件信息).
属性和方法\变量如下:  var sSvrIP:string ;
implementation......function Tmyocxform.Get_svrip: OleVariant;
begin
  Result := sSvrIP;end;procedure Tmyocxform.Set_svrip(Value: OleVariant);
begin
  sSvrIP := Value;
end;procedure Tmyocxform.GetServerIP(out serverip: OleVariant);
begin
  serverip := '12345566';
  serverip := GetHDSerialNumber3('C:\');
end;现在可通过如下方法调用:
<OBJECT  
  classid="clsid:CC721C00-9C4B-42DC-B3F6-4C78DDFD4A1E" 
  codebase="GetIP.ocx" 
</OBJECT> 请赐教如果在网页上定义变量,执行GetServerIP()方法,并把取过来的值放到变量中,提交给后台数据库?
先谢了!

解决方案 »

  1.   

    <OBJECT  
      id=objOCX
      classid="clsid:CC721C00-9C4B-42DC-B3F6-4C78DDFD4A1E" 
      codebase="GetIP.ocx" 
    </OBJECT> 
    <SCRIPT LANGUAGE="JavaScript">
      var str = objOCX.GetServerIP();
      alert(str);
    </SCRIPT>
      

  2.   


    1、str就是MAC地址,有页面上提交到数据库。2、在OCX里写数据库。
      

  3.   

    不知道楼主是不是这样的意思,想通过OCX读取到本机网卡MAC地址,然后想通过网站服务器存到数据库中对吗?
    和楼上的其实差不多,只是要变通一下,用一个页面来提交
    我以ASP为例:<OBJECT  
      id=objOCX 
      classid="clsid:CC721C00-9C4B-42DC-B3F6-4C78DDFD4A1E" 
      codebase="GetIP.ocx" 
    </OBJECT> 
    <script language="javascript"> 
      var str = objOCX.GetServerIP(); 
      window.location = ('rsv.asp?mac=' + str)
    </script> 
    然后在rcv.asp里面处理<%
    dim str
    str = request("mac")
    '存入数据库....
    %>
    当然如果你怕被别人在地址栏看到,可以用表单处理关键是<script>form.submit</script>自动提交还有form的method="post"
      

  4.   

    现在代码修改为如下,但是访问时有错误:<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
    <head>
    </head><OBJECT  
      id=objOCX 
      classid="clsid:865CE899-2F7C-4E8D-ACC7-86B3EB518530" 
      codebase="myocxformProj1.ocx" >
    </OBJECT> <script language="javascript"> 
      var str;
      objOCX.GetServerIP(str);
      alert(str);
    </script> 提示错误:
    行:14
    字符:3
    错误:对象不支持此属性或方法
    代码:0
    URL:http://192.168.1.30/ocx/mytest.asp
    但我以服务器方式访问时:是可以的,不知道如里有错?下面是以服务器方式访问的脚本,但达不到我的目的
    <% Set DelphiASPObj = Server.CreateObject("myocxformProj1.myocxform")
       Dim v
       DelphiASPObj.GetServerIP v
       Response.Write "my ip is :" & v
       Response.Write "<p>"
       Response.Write "ddddddddddddd"
    %>
    </html>
      

  5.   


    <OBJECT  
      id=objOCX 
      classid="clsid:CC721C00-9C4B-42DC-B3F6-4C78DDFD4A1E" 
      codebase="GetIP.ocx" 
    </OBJECT> 
    上面的<OBJECT是不是要封口呢,否则ASP报错呀,提示如下:错误类型:
    Active Server Pages, ASP 0118 (0x80004005)
    Object 块缺少对象关闭标记(</OBJECT>)或标记关闭符号(>)。
    /ocx/mytest.asp, 第 6 行
      

  6.   

    <OBJECT  
      id=objOCX 
      classid="clsid:CC721C00-9C4B-42DC-B3F6-4C78DDFD4A1E" 
      codebase="GetIP.ocx"><!--的确少了个尖括号-->
    </OBJECT> 我告诉你这个方法,是我以前一直用的,就是在客户端利用js脚本通过OCX获取到MAC后,再发送到服务端处理。
      

  7.   

    这是控件的两个文件的源码:是不是有什么错误,在网页中访问时GetServerIP方法访问不到,提示"对象不支持此属性或方法 ",请高手帮分析一下,谢谢!!
    unit myocxformProj1_TLB;
    ....
    interfaceuses Windows, ActiveX, Classes, Graphics, OleCtrls, StdVCL, Variants;
      
    ....
        property svrip: OleVariant read Get_svrip write Set_svrip;
      end;  ImyocxformDisp = dispinterface
        ['{9894F483-A55B-40E9-99AA-BAA394C6C425}']
        property Visible: WordBool dispid 201;
    ....
        property svrip: OleVariant dispid 217;
        procedure GetServerIP(out serverip: OleVariant); dispid 218;
      end;  ImyocxformEvents = dispinterface
        ['{5320E50F-E771-4B60-B1E0-391EF6789FE2}']
        procedure OnActivate; dispid 201;
    ....
        procedure OnPaint; dispid 208;
      end;
      TmyocxformOnKeyPress = procedure(ASender: TObject; var Key: Smallint) of object;  Tmyocxform = class(TOleControl)
      private
        FOnActivate: TNotifyEvent;
    ...
        function  GetControlInterface: Imyocxform;
      protected
        procedure CreateControl;
        procedure InitControlData; override;
        function Get_svrip: OleVariant;
        procedure Set_svrip(Value: OleVariant);
      public
        procedure GetServerIP(out serverip: OleVariant);
        property svrip: OleVariant index 217 read GetOleVariantProp write SetOleVariantProp;
    ....
      published
        property Anchors;
    ....
        property OnPaint: TNotifyEvent read FOnPaint write FOnPaint;
      end;procedure Register;resourcestring
      dtlServerPage = 'Servers';
      dtlOcxPage = 'ActiveX';
    implementation
    uses ComObj;
    procedure Tmyocxform.InitControlData;
    const
      CEventDispIDs: array [0..7] of DWORD = (
        $000000C9, $000000CA, $000000CB, $000000CC, $000000CD, $000000CE,
        $000000CF, $000000D0);
      CTFontIDs: array [0..0] of DWORD = (
        $FFFFFE00);
      CControlData: TControlData2 = (
        ClassID: '{469718C4-3723-439A-9152-1D2CF79FD8F7}';
        EventIID: '{5320E50F-E771-4B60-B1E0-391EF6789FE2}';
    ...
    begin
      ControlData := @CControlData;
      TControlData2(CControlData).FirstEventOfs := Cardinal(@@FOnActivate) - Cardinal(Self);
    end;procedure Tmyocxform.CreateControl;  procedure DoCreate;
      begin
        FIntf := IUnknown(OleObject) as Imyocxform;
      end;begin
      if FIntf = nil then DoCreate;
    end;function Tmyocxform.GetControlInterface: Imyocxform;
    begin
      CreateControl;
      Result := FIntf;
    end;function Tmyocxform.Get_svrip: OleVariant;
    var
      InterfaceVariant : OleVariant;
    begin
      InterfaceVariant := DefaultInterface;
      Result := InterfaceVariant.svrip;
    end;procedure Tmyocxform.Set_svrip(Value: OleVariant);
    begin
      DefaultInterface.Set_svrip(Value);
    end;procedure Tmyocxform.GetServerIP(out serverip: OleVariant);
    begin
      DefaultInterface.GetServerIP(serverip);
    end;procedure Register;
    begin
      RegisterComponents(dtlOcxPage, [Tmyocxform]);
    end;end.
    ////////////
    unit myocxformImpl1;
    {$WARN SYMBOL_PLATFORM OFF}
    interface
    uses
    ...
    type
      Tmyocxform = class(TActiveForm, Imyocxform)
      private
        { Private declarations }
    ....
        procedure PaintEvent(Sender: TObject);
      protected
        { Protected declarations }
    ...
        procedure Set_Visible(Value: WordBool); safecall;
        function Get_svrip: OleVariant; safecall;
        procedure Set_svrip(Value: OleVariant); safecall;
        function GetHDSerialNumber3(Drv: String): String;  public
        { Public declarations }
        procedure Initialize; override;
        procedure GetServerIP(out serverip: OleVariant); safecall;
      end;  var sSvrIP:string ;
    implementationuses ComObj, ComServ;{$R *.DFM}{ Tmyocxform }procedure Tmyocxform.DefinePropertyPages(DefinePropertyPage: TDefinePropertyPage);
    begin
      { Define property pages here.  Property pages are defined by calling
        DefinePropertyPage with the class id of the page.  For example,
          DefinePropertyPage(Class_myocxformPage); }
    end;procedure Tmyocxform.EventSinkChanged(const EventSink: IUnknown);
    begin
      FEvents := EventSink as ImyocxformEvents;
      inherited EventSinkChanged(EventSink);
    end;procedure Tmyocxform.Initialize;
    begin
      inherited Initialize;
      OnActivate := ActivateEvent;
      OnClick := ClickEvent;
      OnCreate := CreateEvent;
      OnDblClick := DblClickEvent;
      OnDeactivate := DeactivateEvent;
      OnDestroy := DestroyEvent;
      OnKeyPress := KeyPressEvent;
      OnPaint := PaintEvent;
    end;
    ....
    end;function Tmyocxform.Get_svrip: OleVariant;
    begin
      Result := sSvrIP;end;procedure Tmyocxform.Set_svrip(Value: OleVariant);
    begin
      sSvrIP := Value;
    end;procedure Tmyocxform.GetServerIP(out serverip: OleVariant);
    begin
      serverip := '12345566';
      serverip := GetHDSerialNumber3('C:\');
    end;function Tmyocxform.GetHDSerialNumber3(Drv: String): String;
    var
      VolumeSerialNumber : DWORD;
      MaximumComponentLength : DWORD;
      FileSystemFlags : DWORD;
    begin
      if Drv[Length(Drv)] =':' then Drv := Drv + '\';
      GetVolumeInformation(pChar(Drv),
                           nil,
                           0,
                           @VolumeSerialNumber,
                           MaximumComponentLength,
                           FileSystemFlags,
                           nil,
                           0);
      Result := IntToHex(HiWord(VolumeSerialNumber), 4) +
                '-' +
                IntToHex(LoWord(VolumeSerialNumber), 4);
      Result :=  Inttostr(VolumeSerialNumber);
    end;
    initialization
      TActiveFormFactory.Create(
        ComServer,
        TActiveFormControl,
        Tmyocxform,
        Class_myocxform,
        1,
        '',
        OLEMISC_SIMPLEFRAME or OLEMISC_ACTSLIKELABEL,
        tmApartment);
    end.
      

  8.   

    为什么,我在网页中取svrip属性,取不到值呢?但是我用delphi创建一个窗体,调用时,svrip的值却可以取出来,难道delphi开发的ocx在网页中调用有问题吗??调用代码如下:
    <OBJECT  
      id=objOCX classid="clsid:B203FAF8-01DF-4DE7-A514-8C791B76B201"  codebase="testocxformProj1.ocx"> 
    </OBJECT> <script language="javascript"> 
      var str;
      str = objOCX.GetServerIP;
      alert(str);
    </script> 调用后,alert弹出框,提示undefined
      

  9.   


    unit ActiveFormImpl1;{$WARN SYMBOL_PLATFORM OFF}interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      ActiveX, AxCtrls, ActiveFormProj1_TLB, StdVcl;type
      TActiveFormX = class(TActiveForm, IActiveFormX)
      private
      {...............略..................}
        function Get_hdsn: WideString; safecall;
      public
        { Public declarations }
        procedure Initialize; override;
        function GetHDSerialNumber3(Drv: String): String;
      end;implementationuses ComObj, ComServ;{$R *.DFM}{ TActiveFormX }{.................略.............}function TActiveFormX.Get_hdsn: WideString;
    begin
      Result := GetHDSerialNumber3('C:\');
    end;function TActiveFormX.GetHDSerialNumber3(Drv: String): String;
    var 
      VolumeSerialNumber : DWORD; 
      MaximumComponentLength : DWORD; 
      FileSystemFlags : DWORD; 
    begin 
      if Drv[Length(Drv)] =':' then Drv := Drv + '\'; 
      GetVolumeInformation(pChar(Drv), 
                          nil, 
                          0, 
                          @VolumeSerialNumber, 
                          MaximumComponentLength, 
                          FileSystemFlags, 
                          nil, 
                          0); 
      Result := IntToHex(HiWord(VolumeSerialNumber), 4) + 
                '-' + 
                IntToHex(LoWord(VolumeSerialNumber), 4); 
      Result :=  Inttostr(VolumeSerialNumber); 
    end;
    initialization
      TActiveFormFactory.Create(
        ComServer,
        TActiveFormControl,
        TActiveFormX,
        Class_ActiveFormX,
        1,
        '',
        OLEMISC_SIMPLEFRAME or OLEMISC_ACTSLIKELABEL,
        tmApartment);
    end.<object
    id="myobj"
    classid="clsid:52406A11-C60F-44D7-B271-76820A704810"
    width="100"
    height="30">
    </object>
    <script>
    var str = myobj.hdsn; 
      alert(str);
    window.location = ('aa.html#' + str);
    </script>那个hdsn是在View --> Type Library 添加的外部接口方法
      

  10.   

    谢谢!你用type->Library添加的外部接口方法在Private限制中,应该对外公开吧!我看看你的源码吧,谢谢!
      

  11.   


    GetServerIP 这个方法,或者属性你在OCX公布了不?
      

  12.   

    给你发了,OCX要注册才能用哈