delphi2007 教程

delphi2007 教程

首页 新随笔 联系 聚合 管理
  1013 Posts :: 0 Stories :: 28 Comments :: 0 Trackbacks

#

delphi 怎么ping计算机名或ip 地址 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiNetwork/html/delphi_20061201140126219.html
delphi   怎么ping计算机名或ip   地址???

indy   idICMP

function   TMainForm.ping(   var   url:   string):boolean;     var  
      aIdICMPClient:   TIdICMPClient;  
  begin  
      aIdICMPClient:=   TIdICMPClient.Create(nil);  
      aIdIcmpclient.ReceiveTimeout:=500;                  
      aIdICMPClient.Host:=   url;  
      try  
          aIdICMPClient.Ping();  
      except  
          Result:=   False;  
      end;  
      if   (aidicmpclient.ReplyStatus.fromipaddress<>'0.0.0.0')  
            and   (aidicmpclient.ReplyStatus.fromipaddress<>'')   then  
          result:=true  
      else  
          result:=false;  
      aIdICMPClient.Free;  
  end;  
   
   
  我这里能ping   通ip地址,但是ping   不通计算机名?  
  为何

在“CMD”里面Ping一下看  
  另外,如果操作系统是XP,有时是Ping机器名时是Ping不到的

在HOSTs文件里面加一条就可以了:(XP:   C:\WINDOWS\system32\drivers\etc目录下)  
   
  #   Copyright   (c)   1993-1999   Microsoft   Corp.  
  #  
  #   This   is   a   sample   HOSTS   file   used   by   Microsoft   TCP/IP   for   Windows.  
  #  
  #   This   file   contains   the   mappings   of   IP   addresses   to   host   names.   Each  
  #   entry   should   be   kept   on   an   individual   line.   The   IP   address   should  
  #   be   placed   in   the   first   column   followed   by   the   corresponding   host   name.  
  #   The   IP   address   and   the   host   name   should   be   separated   by   at   least   one  
  #   space.  
  #  
  #   Additionally,   comments   (such   as   these)   may   be   inserted   on   individual  
  #   lines   or   following   the   machine   name   denoted   by   a   '#'   symbol.  
  #  
  #   For   example:  
  #  
  #             102.54.94.97           rhino.acme.com                     #   source   server  
  #               38.25.63.10           x.acme.com                             #   x   client   host  
   
  127.0.0.1               localhost  
  #把你的IP和HOST按下面格式输入  
  200.211.110.133   SANMAOTUO

如果加上楼上说的.肯定是可以通的.  
  但是局域网内丑那么多电脑.我不可能没一台都去改一下hosts文件吧  
  .好像是dns的问题.  
   
  我本来想用api把名字解悉为ip,但是如果不在hosts里面加的话。解析不出来。  
  有没有别的办法啊。。  
  高手们,帮帮我把

路过

posted @ 2009-03-02 11:33 delphi2007 阅读(1325) | 评论 (0)编辑 收藏

郁闷N天了,IDFTP发生10054错误后无法继续上传文件,重新创建IDFTP后发生错误:550 cannot create file。请教解决方法 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiNetwork/html/delphi_20061201111110220.html
如题。

服务器认为文件还没传完,那就锁定了  
  等数分钟,服务器超时后才能恢复!  
   
  所以,你得保证传输尽可能别突然断线

为什么重启程序后又能正常传输?

我测试了下(服务器为Serv-U,Win2K)  
  重启Serv-U,不重启程序不能传输;但重启我的程序,不重启Serv-U可以传输。why?

已解决。  
  Indy升级到Indy9,  
  IDFTP单元中的InternalGet函数引去如下语句,同样处理InternalPut;  
      //   ToDo:   Change   that   to   properly   handle   response   code   (not   just   success   or   except)  
      //   226   =   download   successful,   225   =   Abort   successful}  
  //     LResponse   :=   GetResponse([225,   226,   250,   426,   450]);          
  //     if   (LResponse   =   426)   or   (LResponse   =   450)   then   begin  
  //         GetResponse([226,   225]);  
  //         DoStatus(ftpAborted,   [RSFTPStatusAbortTransfer]);  
  //     end;

但重启我的程序,不重启Serv-U可以传输。why?  
   
  因为你的本地文件是以独占模式打开的。

posted @ 2009-03-02 11:33 delphi2007 阅读(1233) | 评论 (0)编辑 收藏

线程调用webservice出错了。。。 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiNetwork/html/delphi_20061201110329221.html
var  
  ht:Thttprio;  
  it1:Ifilews;  
  markinfo:integer;  
  begin  
  try  
          ht:=THTTPRIO.Create(nil);  
          //it1:=getIfilews(true,'',ht);  
          it1:=getifilews;       ===================>如果是线程,这里会出错  
          markinfo:=it1.isfileExists('e:\12.txt');  
    if   markinfo=0   then  
          begin  
              self.Caption   :='文件存在';  
          end  
          else  
          begin  
              self.Caption:='文件不存在';  
          end;  
    finally  
        ht.Free;  
    end;  
  end;  
  //就以上这段代码,  
  //在主界面ok,线程中这些代码就出现Abstract   Error的错误  
  //怎么找都找不到原因,到底为什么?

由此看到Delphi人气不行......

从你的表述上看,这个问题与WebService没有关系.我想问问,你在你的测试线程中去实现了Execute这个方法了吗?

你们这些捣蛋鬼.人家是很认真问问题的,不是说笑的哈.  
   
  请妖哥,把这个问题好好解释.  
  如果解释不清,就扣你10000分.  
  解释好了老冯给你一颗LOLLIPOP.

对不起,发错了。

哎。。。没有人来。。。。

TThread是抽象类,   请LZ看看在你的测试线程中没有去实现EXECUTE?

我把上面那一段拷贝到线程的EXECUTE了

问题就是如上所说

把涉及到的webservice那几行注掉看看  
  getifilews里面是什么??  
  另:   线程里面就没有caption了

在线程中使用,代码要加上     CoInitialize与     CoUnInitialize  
   
   
  //线程开始  
      CoInitialize(nil);  
  try  
  ...//创建RIO  
  ...//调用  
   
  finally  
      CoUnInitialize;  
  end;  
 

====  
  在Create和Destory里我做了CoInitialize(nil);   CoUnInitialize;  
  ====  
  GetIfilews是获得接口的方法,由WSDL   import   生成。  
  ====  
  现在错误如下:  
  //在主界面ok,线程中这些代码就出现Abstract   Error的错误  
   
  网络上查是说将接口实例化,但是我不知道该怎么改正这个错误。  
  各位达人能不能给个更清晰的说法啊?

主要问题就在GetIfilews里面了,  
  另  
  GetIfilews是获得接口的方法,由WSDL   import   生成     不是很明白

我感觉就是GetIfilews这个函数里面的问题,就看里面做了些什么内容了,应该和函数处理有关系的

哎~~  
  GetIfilews   没有问题。是我的问题。  
   
  这样才ok  
              CoInitialize(nil);  
        try  
              ht:=THTTPRIO.Create(nil);  
              ht.URL:='http://../webservicetest/Filews.dll/soap/ifilews';  
              ht.WSDLLocation:='http://../webservicetest/Filews.dll/wsdl/ifilews';  
              ht.Service:='Ifilewsservic'  
              ht.Port:='ifilewsPort';  
       
              it1:=ht   as   Ifilews;  
              it1.xxx(...)  
        finally  
                  CoUnInitialize;  
        end;  
  归根到底还是自己对WebService传输过程不了解。谢谢大家关注。

posted @ 2009-03-02 11:33 delphi2007 阅读(550) | 评论 (0)编辑 收藏

如何自动登录网页并分析网页 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiNetwork/html/delphi_20061201105531222.html
带frame的php网站,利用webbrower  
   
  想实现自动登录并自动分析获取网页中的数据,该网页中的数据定时自动刷新。  
  见有利用IHTMLDocument2的方法,用Olevariant进行赋值;因为不知道网页上对应input、submit控件的名称,所以不知道可行否;我使用o:=wb.OleObject.document.all.tags('input',0);后,o.value:=xx的时侯抛异常,提示automation   object不支持value方法。  
  急~  
 

>不知道网页上对应input、submit控件的名称  
  view   source  
  o:=wb.OleObject.document.all.tags('input',0);后,o.value:=xx的时侯抛异常,提示automation   object不支持value方法。  
  document.all.tags   returns   a   collection.   you   should   locate   the   input   by   its   type,   location   or   style.  
 

还是不明白  
  如何获取带frame网页中的数据呢?是一个表单,可能有多页,php的网站

query   IHTMLWindow2   or   IWebBrowser2   from   the   frame   element

谢谢大虾的解答,但我的问题还没有解决,目前我已经实现遍历frame得到指定frame的页面源码。该页面中有一个表单,我想读取这个表单的内容,除了用字符串方法外,有没有什么用类似取element属性的方法可以得到表格中的数据?该表格有多页,有没有办法一次取得所有数据?  
  对于frame中相关页面的tagname我用以下方法进行遍历,发现取得的tagname值均为html,为什么?  
    doc:=Wb.document   as   IHtmlDocument2;    
    frameCol:=doc.frames;  
    for   i:=0   to   frameCol.Length-1   do  
    begin  
        vi:=i;  
        frame:=frameCol.Item(vi);  
        frame.QueryInterface(IID_IHTMLWindow2,framewin2);  
        if   LowerCase(framewin2.name)='frame1'   then  
        begin  
            mmo.Lines.Add(framewin2.document.body.innerHTML);  
            doc2:=framewin2.document   as   IHtmlDocument2;  
            for   j:=0   to   doc2.all.length-1   do  
            begin  
                _element:=   doc2.all.item(i,EmptyParam)   as   IHTMLElement;//估计是这句话的问题,但不知道如何改  
                mmo.Lines.Add(_element.tagname);  
            end;  
        end;

不要用IHTMLELEMENT,直播用OLEDOCUMENT,  
  我就是这样做的,   分析很畅快,而且不会出错

怎么做的,能不能给个例子?  
  我需要获取指定frame的table中的数据,最好是一次获取多页的数据  
  还有就是关于自动登录后,如何等待提交成功后页面的完成?

关注一下:)

1   query   IHTMLTable   from   IHTMLElement   if   the   tagname   is   "table"  
  2   handle   the   DocumentComplete   event

[CLSCompliant(false),   ComVisible(false)]  
  public   static   void   SaveTableByColumn(IHTMLTable   table,   StringDictionary   container)  
  {  
  if   (table   ==   null)  
  return;  
  if   (container   ==   null)  
  return;  
  foreach   (object   o   in   table.rows)  
  {  
  IHTMLTableRow   row   =   (IHTMLTableRow)o;  
  for   (int   j   =   0;   j   <   row.cells.length   /   2;   j++)  
  {  
  string   key   =   ((IHTMLElement)row.cells.item(j,   0)).innerText;  
  string   value   =   ((IHTMLElement)row.cells.item(j   +   1,   0)).innerText;  
  if   (key   !=   null   &&   value   !=   null)  
  {  
  key   =   key.Trim();  
  value   =   value.Trim();  
  if   (key.Length   >   0)  
  container.Add(key,   value);  
  }  
  }  
  }  
  }  
  [CLSCompliant(false),   ComVisible(false)]  
  public   static   List<IHTMLTable>   GetDescentsTables(IHTMLElement   htmlElement)  
  {    
  List<IHTMLTable>   tableList=new   List<IHTMLTable>();  
  if   (htmlElement==null)  
  return   tableList;  
  IHTMLElementCollection   formDescents   =   (IHTMLElementCollection)htmlElement.all;  
  foreach   (object   o   in   formDescents)  
  {  
  IHTMLElement   he   =   (IHTMLElement)o;  
  if   (he.tagName.ToLower().CompareTo("table")==0)  
  {  
  IHTMLTable   t   =   (IHTMLTable)he;  
  tableList.Add(t);  
  }  
  }  
  return   tableList;  
  }  
  [CLSCompliant(false),   ComVisible(false)]  
  public   static   List<IHTMLTable>   GetChildTables(IHTMLElement   htmlElement)  
  {  
  List<IHTMLTable>   tableList   =   new   List<IHTMLTable>();  
  if   (htmlElement   ==   null)  
  return   tableList;  
  IHTMLElementCollection   formChildren=   (IHTMLElementCollection)htmlElement.children;  
  foreach   (object   o   in   formChildren)  
  {  
  IHTMLElement   he   =   (IHTMLElement)o;  
  if   (he.tagName.ToLower().CompareTo("table")   ==   0)  
  {  
  IHTMLTable   t   =   (IHTMLTable)he;  
  tableList.Add(t);  
  }  
  }  
  return   tableList;  
  }

我试过在document   complete里判断,但不成功,第一个页面我可以用busy和ReadyState来判断(单个用好象也不很准)。我的程序第一个页面自动submit.click后,需要等待submit成功后转向的页面加载完成,这时用busy、Readystate等方法都不行,我也试过取title,但可能因为是frame的结构,也无法判断(有可能是我判断的方法不对)。  
   
  由于我不太清楚如何用post方法让网页返回所需要的指定页面(我用取到的url直接访问指定的数据页面时,网站直接跳到了登录页面,估计网站不是通过cookie来判断,有可能用session或refer方法来判断,如果有方法可以直接get或post到数据页面的话,就可以不用自动登陆的方法了,毕竟这个方法很费时间,而且受限制太多)所以我才走了这个弯路:从登陆页面开始由程序实现自动提交。网站的用户名和密码好象有加密,但加载数据的页面用的是用户名进行查询的,所以如果可以实现直接post或get,那么我只用通过登陆页面后取加密后的uid和pwd再直接get或post了(有时间抓个包研究加密过程后就可以直接get或post了)  
   
  对于你提供的代码我看不太懂,在参考一下资料后,我自己写了一个多框架中取table的方法,但在取table元素的地方写不下去了,不知道该怎么提取  
    doc:=WebBrowser.document   as   IHtmlDocument2;  
    frameCol:=doc.frames;  
    for   i:=0   to   frameCol.Length-1   do  
    begin  
        vi:=i;  
        frame:=frameCol.Item(vi);  
        frame.QueryInterface(IID_IHTMLWindow2,framewin2);  
        if   LowerCase(framewin2.name)='frametable'   then  
        begin  
            doc2:=framewin2.document   as   IHtmlDocument2;  
            _element:=doc2.get_all;  
            for   j:=0   to   doc2.all.length-1   do  
            begin  
                tbDisp:=_element.item(j,0);  
                if   SUCCEEDED(tbDisp.QueryInterface(IHTMLTable,HtmlTblEle))   then  
                with   HtmlTblEle   do  
                begin  
                    for   m:=0   to   HtmlTblEle.cols-1   do  
                    begin  
                        _element   :=HtmlTblEle.rows;  
                        for   n:=0   to   _element.length-1   do  
                        begin  
                            //如何将table内容输出?  
  //                           mmo.Lines.Add(_element.item(0,0));  
                        end;  
                    end;  
                end;  
 

取table的问题已经解决,多页的如何取呢?一定要一个个地取吗?有没有next之类的方法可用?再就是如何判断自动登陆后跳转到的页面加载完成

yes  
  you   have   to   detect   the   change   of   page   numbers  
 

table一个个地取没问题,只是不能做到实时了,如果对实时性要求较高就麻烦了  
   
  对于等待自动登陆后跳转到的页面加载完成,我实在是没什么好办法了,因为涉及到多frame,用documentcomplete不好使,目前我使用的是在这个事件中对frame进行count,到了指定的数字后就可以认为加载完了,不过虽然理论上是一个good   idea,但我还没测试成功   :(  
  不知道还有没有什么别的好方法?

check   ready   state

readystate我也试过,也不行,click之后直接就到了判断readystate,但此时,由于刚刚click,wb还没有跳转,此时的readystate还是第一个页面的,当然就认为ready了

我在click之后加了个1~1000的计数循环,然后再判断就ok了

check   ready   state   in   your   documentcomplete   handler   to   make   sure   ALL   frames   are   ready

在其它代码没有改动的情况下,我就在click之后加了个计数循环用ready和busy就可以正常判断了;而我使用documentcomplete对frames进行count时,却不管用

我用JAVA做过同样的东西.当时是为了抓取QQ天气,并可以根据提交的城市获取不同的天气情况,Delphi有同样的3rd控件,我曾经看过Demo,效果相当不错.做成论坛轰炸机都没有问题,呵呵.

3rd控件?能否详细告之

楼主使用DOM的方法来获得表格内容,我认为不是一个好办法。费时费事不说,而且效率底下。  
   
  比较高效的做法是:直接读取整个页面的HTML,然后使用规则表达式,获取页面中符合条件的代码片断。这样做比DOM高效N倍。  
   
  对于分页的问题,估计没有什么好办法。唯一可行的就是获得“下一页”的地址,然后循环读取页面。

tttk大虾所提到的dom方法的意思是什么  
  为了能和页面进行交互,目前我只能想到加载页面并用shtml的方法对页面进行控制  
  还请tttk大虾多多指点

自己分析页面获得当前页码和是否是最后一页……

我现在要做的并不只是分析网页内容,而且要在满足条件后与页面进行交互,这个交互过程是完全自动的。所以取得页面的element,然后在满足条件后对element进行控制,我想这应该是唯一可行的办法。  
   
  IHTMLTable2好象有FirstPage、LastPage的属性,但没有见到有NextPage的属性,如果有此属性或许就只用一个nextpage方法就ok了,分页功能的实现是由数据访问层来控制的吧?  
   
  目前还有个麻烦,就是控制的问题,现在我已经可以用嵌套循环取得某个特定frame中的element的属性,而对其控制的话我现在只找到了这样的方法:WB.oleobject.document.documentelement.document.frames.item(0).document.all.item('name',0),也就是说得先把该element所在的frame序数找出来,然后再套这个式子;然而,如果这个frame序数是根据条件变化的,就麻烦了。我想在用循环遍历找到特定的element之后,能够直接对该element进行交互。

用for   each循环,判断frame的URL,input的ID,Table的表头之类的特征值

循环遍历后直接对取得的element控制的问题已经解决了,搞定后才发现好简单。  
   
  非常感谢蒋晟大虾的热情解答。我现在在搞分页的问题,对于分页你有没有什么好的建议?

posted @ 2009-03-02 11:33 delphi2007 阅读(928) | 评论 (0)编辑 收藏

TCPserver Tcpclient 怎么实现聊天室一起聊天的功能呢? Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiNetwork/html/delphi_20061130225339223.html
TCPserver   Tcpclient     两个组件分开的  
  一个在服务器端!一个在客户端!  
  怎么实现所以用户参与发的信息都在客户端那里显示??谢谢!!  
  小弟急啊!  
 

很简单的,在你熟悉一对一的聊天处理编程方式后,充分运用中介者模式(MEDIATOR)能很轻松的就处理这个问题了。

客户发送信息到服务器后,服务器向每个客户连接都发就可以了  
  和一般得聊天没什么差别,就像聊天程序得登录一样,为什么每个你得好友的头像都变成了在线?   也是发消息的

用一个循环来给每个用户发信息吗?  
   
  MEDIATOR这个中介?怎么搞呢?有没例子,我没时间慢慢搞咯!  
  时间太急了!

demo   里面就在有一个  
   
  服务端收到一个个广播发送就好了

谁有程序的发上来参考下好吗?  
 

posted @ 2009-03-02 11:33 delphi2007 阅读(570) | 评论 (0)编辑 收藏

关于IdFTP的问题 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiNetwork/html/delphi_20061130180317224.html
我的代码如下  
      with   IdFTP1   do  
          begin  
              Username:='administrator';  
              password:='';  
              port:=3800;  
              host:='192.168.0.33';  
          end;  
      idftp1.Connect;//执行到这句报错10061错误,我没有做服务端  
  只是用iis设置了一个ftp目录,不知道是不是因为这个问题  
 

有人知道吗?idftp如何上传下载文件

自己搞吧,这个很容易的  
  Indy有Demo的~

哎,好了可以联成了

posted @ 2009-03-02 11:33 delphi2007 阅读(259) | 评论 (0)编辑 收藏

远程屏幕传输“差异截图”的问题。 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiNetwork/html/delphi_20061130140714225.html
求差异截图的远程屏幕传输代码。  
   
  PS:DELPHI园地网站的差异截图代码太烂了

具体什么意思?

mirror   dirver   的驱动,,吧不错的

posted @ 2009-03-02 11:33 delphi2007 阅读(420) | 评论 (0)编辑 收藏

有关DLL的问题 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiNetwork/html/delphi_20061129214757227.html
在一个ASP页面,用了一个DLL文件,我想在DLL中直接获取当前网页的网址,怎么做呢?  
  不能通过由ASP页面传值过来的方式.

在DLL中生成一个indy组件就可以了   让它去下载

zuoansuifeng:麻烦,能不能说得详细点.  
  用indy的什么组件呢?  
  谢谢!

posted @ 2009-03-02 11:33 delphi2007 阅读(73) | 评论 (0)编辑 收藏

关于indy连接ftp的问题 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiNetwork/html/delphi_20061129180236228.html
try          
          IdFTP1.Disconnect;  
          IdFtp1.Host:='61.15.22.11';  
          IdFtp1.Port:=21;  
          IdFtp1.Username:='admin';  
          IdFtp1.Password:='123';  
   
          IdFTP1.IOHandler   :=   IdIOHandlerStack1;  
          IdIOHandlerStack1.TransparentProxy   :=   IdSocksInfo1;  
          IdSocksInfo1.Version   :=   svSocks5;  
          IdSocksInfo1.Host:='192.168.6.254';  
          IdSocksInfo1.Port:=1080;  
   
          IdFTP1.Connect;  
          Cursor   :=   crArrow;  
          ShowMessage('连接成功');  
        except  
          ShowMessage('连接失败');  
        end;  
   
        if   IdFTP1.Connected   then  
        begin  
              IdFTP1.ChangeDir('/');  
              IdFTP1.TransferType   :=   ftASCII;  
              IdFTP1.List(listbox1.items);  
      end;  
   
  已经连接上远程主机,但是在list目录时报错。  
  提示'host   unreachable',不知道怎么回事,请各位看看。  
  急啊

帮顶

怎么没人解答呢?

posted @ 2009-03-02 11:33 delphi2007 阅读(357) | 评论 (0)编辑 收藏

关于bds2006里面的indy 问题!!!!!! Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiNetwork/html/delphi_20061129173832229.html
1.现在用BDS2006,谁能告诉我里面的indy是9还是10啊?  
  2.里面的udpserver不会用,read事件里的ADATA是TBytes格式的,不会用  
  3.谁能把用Tbytes的dup   client和server之间字符的传输如何实现,用代码完整的说一下啊?  
   
  谢谢了!!!!!!!!!  
 

安装2006时会要求用户选择indy9/indy10

是10吧

TBytes=array   of   byte;  
 

不用担心,  
  除了TBytes有点特别,其他的都差不多,  
   
  好像还有一个sendbuffer  
  都转为TBytes类型就可以了,  
  其实就是byte的动态数组!

posted @ 2009-03-02 11:33 delphi2007 阅读(227) | 评论 (0)编辑 收藏

遵循Modbus协议通过Usb(Ch375)通信的上位机传输问题 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiNetwork/html/delphi_20061129164355231.html
Usb芯片:Ch375  
  协议:Modbus  
  上位机开发软件:delphi  
  传输格式(RTU):  
  帧定义:  
  头|命令|长度|数据(高)       ----           数据(低)|CRC  
                            C0C1C2   S0S1S2   T10T11   T20T21   P0P1  
  01     02       0C     000000   000000     0000       0000     0000     XX  
   
  第一次做这种软件,还没有在下位机上测试,先贴出部分源码,请大家帮忙改正。  
  还有对于从下位机取出来的数据(已从16进制转换成10进制)有几个疑问:  
  1。是不是就代表了真实的值,是否还需要再转换;  
  2。如何处理浮点型数据。  
  下面是部分源码:

//读数据  
  function   ReadData(iIndex:Integer;var   oBuffer:PChar;var   ioLength:Integer):Boolean;  
      stdcall;   external   DllFile   name   'CH375ReadData';  
   
  function   TPublicFun.GetData:Integer;  
  var  
      Buff_HAdd     :   Byte;//帧:头地址  
      Buff_Cmd       :   Byte;//帧:命令  
      Buff_Len       :   Byte;//帧:长度  
   
      Buff_DatLC   :   array[1..3]   of   Byte;//帧:LC数据  
      Buff_DatLS   :   array[1..3]   of   Byte;//帧:LS数据  
   
      Buff_DatT1   :   array[1..2]   of   Byte;//帧:T1数据  
      Buff_DatT2   :   array[1..2]   of   Byte;//帧:T2数据  
      Buff_DatP     :   array[1..2]   of   Byte;//帧:P数据  
       
      Buff_Send     :   array   of   Byte;//用于存放各个域合成的总的串  
      I,BuffLen,TempLen     :   Integer;//传输的实际数据长度  
      TempStr,CSort         :   string;//用于存放string类型的测试传输帧  
      Rtl                 :   Boolean;  
      PChar_Send   :   PChar;  
  begin  
      Result           :=   -1;  
   
      //测试用,假设Usb设备已打开  
      Usb_Opened   :=   True;  
   
      if   Usb_Opened   then  
          begin  
              //设置头地址  
              Buff_HAdd     :=   HeadCode;  
              //设置命令  
              Buff_Cmd       :=   StatusCode;  
   
              //设置长度  
              Buff_Len       :=   strtohex1(IntToHex(17,2),2);  
              TempLen         :=   17;  
   
                  //初始化LC,LS  
                  for   I:=1   to   3   do  
                      begin  
                          Buff_DatLC[I]   :=   $00;  
                          Buff_DatLS[I]   :=   $00;  
                      end;  
                  //初始化T,P  
                  for   I:=1   to   2   do  
                      begin  
                          Buff_DatT1[I]   :=   $00;  
                          Buff_DatT2[I]   :=   $00;  
                          Buff_DatP[I]     :=   $00;  
                      end;  
   
              SetLength(Buff_Send,TempLen);  
              //设置总串  
              Buff_Send[1]   :=   Buff_HAdd;  
              Buff_Send[2]   :=   Buff_Cmd;  
              Buff_Send[3]   :=   Buff_Len;  
   
              Buff_Send[4]   :=   Buff_DatLC[1];  
              Buff_Send[5]   :=   Buff_DatLC[2];  
              Buff_Send[6]   :=   Buff_DatLC[3];  
   
              Buff_Send[7]   :=   Buff_DatLS[1];  
              Buff_Send[8]   :=   Buff_DatLS[2];  
              Buff_Send[9]   :=   Buff_DatLS[3];  
   
              Buff_Send[10]   :=   Buff_DatT1[1];  
              Buff_Send[11]   :=   Buff_DatT1[2];  
   
              Buff_Send[12]   :=   Buff_DatT2[1];  
              Buff_Send[13]   :=   Buff_DatT2[2];  
   
              Buff_Send[14]   :=   Buff_DatP[1];  
              Buff_Send[15]   :=   Buff_DatP[2];  
   
                      //CRC校验:即校验域前的几个域的集合  
                      I   :=   CRC(Buff_Send[1],15);  
                      Buff_Send[16]   :=   I   div   256;  
                      Buff_Send[17]   :=   I   mod   256;  
   
              //获得string类型的测试传输帧  
              TempStr   :=   '';  
              for   I:=   1   to   TempLen   do  
                  TempStr   :=   TempStr   +   inttohex(Buff_Send[i],2);  
   
              BuffLen         :=   TempLen   *   2;  
              PChar_Send   :=   PChar(TempStr);  
   
              //发送命令  
              //测试屏蔽  
              Rtl   :=   ReadData(Usb_Index,PChar_Send,BuffLen);  
   
              if   Rtl   then  
                  begin  
                      //读取返回串  
                      for   I:=   0   to   TempLen-1   do  
                          Buff_rev[I+1]   :=   strtohex1(copy(PChar_Send,I*2+1,2),2);  
   
                      //CRC校验  
                      if   CRC_Check=1   then  
                          begin  
                              TempStr   :=   '';  
                              //校验成功,读出数据  
                              //TempStr   :=   TempStr   +   inttohex(Buff_rev[i+4],2);  
                              for   I:=   0   to   2   do  
                                  begin  
                                      Buff_DatLC[I+1]   :=   Buff_rev[I+4];  
                                      Buff_DatLS[I+1]   :=   Buff_rev[I+7];  
                                  end;  
                              for   I:=   0   to   1   do  
                                  begin  
                                      Buff_DatT1[I+1]   :=   Buff_rev[I+10];  
                                      Buff_DatT2[I+1]   :=   Buff_rev[I+12];  
                                      Buff_DatP[I+1]     :=   Buff_rev[I+14];  
                                  end;  
   
                              //数据处理  
   
                               
                              Result     :=   1;  
                              //初始化接受串  
                              for   I:=1   to   Maxlen   do   Buff_rev[I]:=0;  
                          end;  
                  end  
              else  
                  begin  
                      ShowMessage('数据传输出错,无法得到正确的值!','提示');  
                  end;  
          end  
      else  
          begin  
              ShowMessage('没有发现可用的Usb设备!','提示');  
          end;  
  end;

对于传输帧,我现在有点疑惑:  
  我传向下位机请求和从下位机得到数据都是以上面我和下位机开发人员定义的格式传输并不象下面Modbus中的例子,不知可行否?  
  因为我定义的帧中要获取5个参数的值:LC由C0C1C2构成(高-低)、LS由S0S1S2构成、T1由T10T11构成、T2由T20T21构成、P由P0P1构成。  
  下面是Modbus   RTU中一个例子:  
  主机请求:  
  地址     功能码     第一个寄存器的高位地址     第一个寄存器的低位地址     寄存器的数量的高位     寄存器的数量的低位   错误校验    
  01   03     00                                             38                                   00   01     XX    
   
  从机应答:    
  地址   功能码   字节数   数据高字节   数据低字节   错误校验    
  01   03     2       41                             24                           XX    
   
  数据:16进制=4124,转换成十进制=16676

//发送命令  
              //测试屏蔽  
              Rtl   :=   ReadData(Usb_Index,PChar_Send,BuffLen);  
   
  ReadData应该是读吧?  
   
  你的例子:  
  请求:  
  0103   00380001XX  
  01=>hdr  
  03=>cmd  
  00=>len  
  38=>crc  
  即无数据,后面的数据就错了  
   
  按协议,好像是这样写的  
  PRTUData   =   ^TRTUData;  
  TRTUData   =   packed   record  
      hdr:   Byte;  
      cmd:   Byte;  
      len:   Byte;  
      data:   array   [0..0]   of   Byte;  
      crc:   Byte;  
  end;  
   
  data取决于len的长度

var  
      P:   PByte;  
      rtuLen:   Byte;  
      rtu:   PRTUData;  
  begin  
      rtuLen   :=   SizeOf(TRTUData)   +   DataLen   -   1;  
      rtu   :=   allocMem(rtuLen);  
      rtu.hdr   :=   $01;  
      rtu.cmd   :=   $02;  
      rtu.len   :=   DataLen;  
      P   :=   @rtu.data[0];  
      for   I   :=   0   to   DataLen   -   1   do  
      beg  
          P^   :=   $XX;  
          inc(P);  
      end;  
      P^   :=   crc(xxx);       //   P   ==>   crc  
      WriteData(...,   rtu,   rtuLen)  
  end;

先谢谢ERR0RC0DE()    
  我知道了,你是先发送命令,WriteData(...,   rtu,   rtuLen),然后在通过ReadData(Usb_Index,PChar_Send,BuffLen);读取数据,是吧?  
   
 

看不懂,^_^  
   
   
  顶下!

有兴趣的朋友欢迎继续讨论阿

posted @ 2009-03-02 11:32 delphi2007 阅读(395) | 评论 (0)编辑 收藏

windows2003 com+导出无法在windows2000上安装 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiNetwork/html/delphi_20061129162028232.html
各位,我这现在遇到比较难缠的问题:  
  服务器(操作系统2003)安装了com+组件,导出代理,安装在客户机上(win2000),现在的问题是我在win2000机器上安装总是出错,无法正常安装com+组件,请问这是什么问题,希望大家给点意见,谢谢了!

2003没用过啊~~   是不是导出来的COM组件不跟2000系统下相兼容呢?

试一下用2000导出   看是不是有问题    
  前一阵也遇到这样的问题,后来好像就是导出了两个版本的安装程序  
 

2000下导出没问题,2003导出就不行

2003安全性方面做的过于严谨了,好多在2000上很好设置的,到2003就有问题。^_^  
   
 

大家就没有遇到过类似情况吗  
  我们服务器都买了,新的服务器都是win2003,也够来气的

一般不用那个导出啦,   delphi   用   midas   可能还要   midas.dll,   用   dbx   要带   dbx的   dll,   手动拷齐文件去安装啦

没遇到过...

comanche(太可怕)   (   )   信誉:154         Blog     2006-11-30   08:47:57     得分:   0      
     
     
        一般不用那个导出啦,   delphi   用   midas   可能还要   midas.dll,   用   dbx   要带   dbx的   dll,   手动拷齐文件去安装啦  
       
  你说的这种情况是导出服务器端,而我想要的是导出代理,应该不是一回事  
     
 

posted @ 2009-03-02 11:32 delphi2007 阅读(188) | 评论 (0)编辑 收藏

WebSnap+IntraWeb应用问题 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiNetwork/html/delphi_20061129153643233.html
有人用WebSnap+IntraWeb开发过web应用程序吗???  
   
  我在用WebSnap+IntraWeb开发一个B/S结构的web应用程序,现在遇到一个棘手的问题,我按intraweb控件中的例子实现了从第一个页面跳转到第二个页面的功能(那就是将第一个页面的AutoProcess属性设置为true,并将第二个页面的AutoProcess属性设置为false),可是现在如果我要从第二个页面转到第三个页面该怎么办?我在第二个页面转第三个页面的按键代码中加入了使第二个页面的AutoProcess:=true,并将第三个页面的AutoProcess属性设置为false,可是好像并没有起任何作用啊!!!系统还是提示Internal   Application   Error       Cannot   find   submit   component.错误!  
   
   
  请问哪位能帮我解决呢???

不要用autoprocess转,直接写webapplication.response.SendRedirect(URL:   string)转即可.

posted @ 2009-03-02 11:32 delphi2007 阅读(347) | 评论 (0)编辑 收藏

DELPHI网络电话 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiNetwork/html/delphi_20061129112512234.html
各位大哥哥,用啥控件和原理,是例子就更好了

控件还在制作.  
  原理就很简单:与网络传输文件相同

真正的网络电话和楼上说的不同,你至少需要深入了解通讯行业,否则你无法成功。

posted @ 2009-03-02 11:32 delphi2007 阅读(297) | 评论 (0)编辑 收藏

socket问题,请各位帮忙,谢谢! Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiNetwork/html/delphi_20061129103700235.html
我的服务端程序如下:  
  Procedure   TFileServerThread.ClientExecute;  
  Var  
      Data:   Array[0..1023]   Of   char;  
      RecText:   String;  
      SocketStream:   TWinSocketStream;  
  Begin  
      While   Not   Terminated   And   ClientSocket.Connected   Do  
      begin  
          Try  
              SocketStream   :=   TWinSocketStream.Create(ClientSocket,   30000);  
              if   SocketStream.WaitForData(60000)   then  
              begin  
                  Try  
                      FillChar(Data,   SizeOf(Data),   0);  
                      If   SocketStream.Read(Data,   SizeOf(Data))   =   0   Then  
                      Begin  
                              ClientSocket.SendText('Timeout   on   Server'+#13#10);  
                              sleep(1);  
                              ClientSocket.Close;  
                              Terminate;  
                      End;  
                      RecText   :=   Data;  
                      If   Length(RecText)   >   2   Then  
                            Delete(RecText,   Pos(#13#10,   RecText),   2);   //   Delete   #13#10  
                      If   ClientSocket.Connected   Then  
                      Begin  
                              ClientSocket.SendText(RecText);  
                              SendMessage(Form1.Listbox1.Handle,   LB_ADDSTRING,   0,   Integer(PChar(RecText)));  
                              PostMessage(Form1.Handle,   CM_INCCOUNT,   0,   0);  
                      End;  
                  Finally  
                  SocketStream.Free;  
                  End;  
              end;  
        Except  
        //HandleException;  
        //showmessage('ERROR!!!!!!!!');  
        ClientSocket.Close;  
        Terminate;  
        End;  
      end;  
  End;  
  但是当程序运行的时候,会在If   SocketStream.Read(Data,   SizeOf(Data))   =   0   Then这一句报错:指定的网路名不再可用。我看过原来的帖子说:把  
  Except  
        //HandleException;  
        //showmessage('ERROR!!!!!!!!');  
        ClientSocket.Close;  
        Terminate;  
        End  
  这一段程序中的HandleException去掉,我现在已经把它去掉了,但是还是在  
  If   SocketStream.Read(Data,   SizeOf(Data))   =   0这一句报同样的错误,是在不知道怎么回事了,请各位大侠帮忙,谢谢!!!      
 

单步跟踪看看吧,可能在执行中把ClientSocket关闭了,那么SocketStream创建不成功。

先调试通server,然后运行他,在来调试client。

posted @ 2009-03-02 11:32 delphi2007 阅读(231) | 评论 (0)编辑 收藏

菜鸟问个问题,idUDPServer发送字符串 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiNetwork/html/delphi_20061128162632236.html
放2个TIdUDPServer  
  procedure   TForm1.FormCreate(Sender:   TObject);  
  begin  
      IdUDPServer1.DefaultPort:=   9000;  
      IdUDPServer1.Active:=   True;  
      IdUDPServer2.DefaultPort:=   5000;  
      IdUDPServer2.Active:=   True;  
  end;  
  定义数据包。不知道这样定义是不是会有问题。如果需要把string定长。那发送超过这个长度的字符串怎么做。  
  type  
      TTestPackage   =   packed   record  
          Head:   cardinal;  
          Body:   string;  
      end;  
   
  //发送  
  procedure   TForm1.Button1Click(Sender:   TObject);  
  var  
      TP:   TTestPackage;  
      p:   Pointer;  
      nSize:   cardinal;  
  begin  
      TP.Head:=   Length(Edit1.Text);  
      TP.Body:=   Edit1.Text;  
   
      nSize:=   SizeOf(TP.Head)   +   Length(TP.Body);  
      GetMem(p,   nSize);  
      CopyMemory(P,   @TP.Head,   SizeOf(TP.Head));  
      CopyMemory(Pointer(Longint(P)+SizeOf(TP.Head)),   Pointer(TP.Body),   Length(TP.Body));  
      IdUDPServer1.SendBuffer('127.0.0.1',   5000,   P,   nSize);  
      FreeMem(p,   nSize);  
  end;  
   
  procedure   TForm1.IdUDPServer2UDPRead(Sender:   TObject;   AData:   TStream;  
      ABinding:   TIdSocketHandle);  
  var  
      s:   string;  
      L:   cardinal;  
  begin  
      AData.Read(L,   SizeOf(L));//读取长度就不对了。  
      SetLength(s,   L);  
      AData.Read(s[1],   L);  
      edit2.Text:=   s;  
  end;

我的想法是给不定长的字符串头部加上他的长度。接收的时候先读取长度,再读取内容。  
  我记得以前用ServerSocket和ClientSocket做过是可行的。不知道为什么上面的代码不成。请教高手解答下。  
   
  Pointer换成MemoryStream试了下也不行  
   
      ms:=   TMemoryStream.Create;  
      ms.Write(TP.Head,   SizeOf(TP.Head));  
      ms.Write(Pointer(TP.Body)^,   Length(TP.Body));  
      IdUDPServer1.SendBuffer('127.0.0.1',   5000,   Pointer(ms.Memory)^,   ms.Size);  
      ms.Free;

已经解决了。。。  
   
  找了半天发现程序里在写入一个常量的时候用了  
  ms.Write(Pointer(CONST_HEAD_LONG_MESSAGE)^,   SizeOf(Integer));  
   
  换成就正常了  
  H:=   CONST_HEAD_LONG_MESSAGE;  
  ms.Write(H,   SizeOf(Integer));    
   
   
 

gx

posted @ 2009-03-02 11:32 delphi2007 阅读(573) | 评论 (0)编辑 收藏

怎么才可以使用 IPX 协议??? Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiNetwork/html/delphi_20061128160205237.html
我想程序中使用IPX协议要加什么控件??

原生   socket   开发,   在   socket   函数建立时指定,   bind   时指定   ipx   的地址就可以了吧

好急的啊。。。。。  
  有人在吗?

老冯有一个IPXUNIT,怎么给你呢?

dbjxtqjcf@163.com  
   
  谢谢。请发到邮箱。最好附带C,S的源码及使用说明一起发过来。  
   
  QQ:156327329  
   
  这个问题烦了我N久了。

dbjxtqjcf@163.com  
 

已发,请查收

里面有DEMO

好谢谢了

帮我也发一份啊.   我的邮箱routros@126.com

posted @ 2009-03-02 11:32 delphi2007 阅读(193) | 评论 (0)编辑 收藏

怎么样获取浏览器“该页无法显示”这类的异常 - - Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiNetwork/html/delphi_20061128152441238.html
用WebBrowser.Navigate,万一页面刷不开,显示“该页无法显示”或者“找不到服务器”,这样的状态怎么捕获?    
   
  求教高人指点   ……

 
    if   WebBrowser.Navigate('某某页面的网址')   =   ''   then    
        showmessage('没有打开到浏览器');  
   
 

posted @ 2009-03-02 11:32 delphi2007 阅读(143) | 评论 (0)编辑 收藏

与C++通信的问题 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiNetwork/html/delphi_20061128144219239.html
最近要用DELPHI写一个与C++通信的东西,我一直玩.NET的,但最近公司把一个DELPHI的项目丢给了我,我公司是游戏公司,目前要实现的功能是我要DELPHI开发一个功能,比如向服务器发送消息,服务器接收到这个消息,然后把一个玩家踢下线.我再接收这个返回的结果,成功还是不成功.本人没玩过DELPHI,对DELPHI跟C++(服务器是C++代码)的通信一点都不知道,忘各位大哥给我一个例子,小弟感激不尽!!!

在tcp/ip协议层的通信不用管对方是什么代码的吧,明白协议就可以了

socket协议可以的

#ifndef   CMD_START  
  #define   CMD_START(name) struct   tag##name { \  
  NMID   CmdID;   WORD   wSize; \  
  tag##name(){   CmdID   =   (NMID)name;   \  
  wSize   =   sizeof(*this);   }  
   
  #define   CMD_END };  
  #endif  
  -------------  
  请大家帮忙把这段C++翻译成DELPHI:)

typedef   unsigned   short   NMID; //Net   message   ID

posted @ 2009-03-02 11:32 delphi2007 阅读(107) | 评论 (0)编辑 收藏

如何截取webbrowser在onnewwindow2前要打开的页面来判断跳转到哪个webbrowser中去 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiNetwork/html/delphi_20061128131746240.html
如题。急!!!

procedure   TfrmRepCenter.wbBeforeNavigate2(Sender:   TObject;  
      const   pDisp:   IDispatch;   var   URL,   Flags,   TargetFrameName,   PostData,  
      Headers:   OleVariant;   var   Cancel:   WordBool);  
  var  
      sURL:   string;  
  begin  
   
          sURL:=ExtractFileName(String(URL));//获得  
   
      end;  
       
  end;

posted @ 2009-03-02 11:32 delphi2007 阅读(1297) | 评论 (0)编辑 收藏

关于连接到服务器判断网络速度的问题 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiNetwork/html/delphi_20061128103014241.html
我用delphi6+sqlserver2000,假如用delphi6开发的程序通过vpn连接到数据库sql2000时,我怎么判断这个程序是运行在vpn还是运行在局域网上面呢?一般是不是判断网络速度,比如我判断这个程序连接数据库服务器时,判断一下网络速度有多少,比如大于10M就是局域网,小于4M就是vpn,这样判断行不行呢?或者有什么其它的方法呢?有没有相关的代码写出来

vpn连接到数据库sql2000时,  
  这要看你的连接在INTERNET上的ADSL宽带网的带宽是多少M了?这会影响到连接速度...  
  你是怎样搞VPN的,用什么硬件VPN路由?VPN连接软件是用操作系统自带的还是买的?

只能通过   ip   还确定,   网速在带宽没全占时是无法确定的,   直连   sql   的话就不知怎样取   ip

如果通过ip来确定的话,就是说通过客户端来取服务器端的ip?那我问一问如果取服务器端的ip,是什么ip?  
  第一、假如这个服务器是在局域网的,如果这个台服务器是双网卡,一个是上internet网,另一个是上局域,那么这台服务器就有两个ip,一个是局域网的内部ip,另一个是上internet网的ip,但是这个程序不能说是运行在vpn上,是运行在局域网上的,这个怎么判断是运行在局域网上?  
  第二、假如是这个服务器是在其它地方,客户端一定要通过vpn也能连接到服务器上,vpn的作用只是模拟一个局域网,只不过宽带的速度比真正的局域网的速度要低很多,但是客户端通过vpn连接到服务器端时,我又怎么来判断是通过vpn来连接局域网的呢?

posted @ 2009-03-02 11:32 delphi2007 阅读(306) | 评论 (0)编辑 收藏

求助:一段Delphi代码是什么意思,想转成java,谢谢 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiNetwork/html/delphi_20061128102242242.html
小弟是作java的,现在要作系统改造,有这么一段代码  
   
  ----------------------------------  
  NMHTTP1:   TNMHTTP;  
  。。。  
  。。。  
  。。。  
  NMHTTP1.Proxy:='';  
  NMHTTP1.ProxyPort:=0;  
  //NMHTTP1.TimeOut   :=20;  
  NMHTTP1.Disconnect;  
  NMHTTP1.Post(URL,ExtractFilePath(Application.ExeName)+'Data\'   +   Edt_ControlNo.Text   +   '.xml'   );  
  ----------------------------------  
  好像是实现的从内网向外网的某个服务器传一个文件,求高手解释一下代码,我想用java来实现,谢谢了

在线等,急用。。。

自己顶一下

Application.ExeName   //就是当前程序名(文件名)  
  ExtractFilePath(Application.ExeName)   //得到程序所在的路径  
  Edt_ControlNo.Text   //是一个输入框  
  可能得到:   C:\temp\Data\007.xml  
   
  NMHTTP1是处理HTTP协议的一个控件  
  HTTP.Post('http://www.csdn.net',   'C:\temp\Data\007.xml');  
  这个你该熟悉吧

posted @ 2009-03-02 11:32 delphi2007 阅读(170) | 评论 (0)编辑 收藏

IDFtp list问题,请大家帮忙 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiNetwork/html/delphi_20061128084519243.html
大家看一下,我用WINDOWS   FTP服务没有问题,而用Serv-U时,在LIST时,总报一个导常.将FTP设置成APassive也不行啊,高手帮忙.  
  function   TCompareFinance.GetDirList:   Boolean;  
  var   i:integer;  
          tempList:TStringS;  
  begin  
      result   :=   true;  
      tempList:=TStringList.Create;  
      try  
          try  
              DirList.Clear;  
              GetFTPInfo;       //得到FTP信息,如IP,PORT,USER等  
              if   not   ftp.Connected   then  
                  ftp.Connect(true,   5000);  
              ftp.Passive   :=   true;  
              ftp.List(tempList,'*.*',false);  
              for   i:=0   to   tempList.Count-1   do  
                  try  
                      ftp.ChangeDir(tempList.Strings[i]);  
                      ftp.ChangeDirUp;  
                      DirList.Add(tempList.Strings[i]);  
                  except  
                  end;  
          except  
              result:=false;  
          end;  
      finally  
          tempList.Free;  
          ftp.Disconnect;  
      end;  
  end;

我用Serv-U,好像List(*.*)没问题。

posted @ 2009-03-02 11:32 delphi2007 阅读(477) | 评论 (0)编辑 收藏

文件操作问题,如何在文件尾部追新的文件片? Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiNetwork/html/delphi_20061127111443244.html
我用indy分片断点传文件,客户端每次发送32K,但是在服务器端接收之后,每次写入都将原来的覆盖了,如何解决?望高手不吝赐教!  
   
  服务器端处理源码:  
      If   sCommand='StreamContent'   Then  
      Begin  
          //接收文件大小  
          sCommand:=AThread.Connection.ReadLn();  
          TotalSize:=StrToInt(sCommand);  
   
          //当前大小  
          fs:=TFileStream.Create('TestReceive.exe',fmOpenRead);  
          NowSize:=fs.Size;  
          fs.Free;  
          lbRecord.Items.Add(IntToStr(NowSize)   +   '/'   +   sCommand);  
   
          //接收流  
          fs:=TFileStream.Create('TestReceive.exe',fmOpenReadWrite);  
          AThread.Connection.ReadStream(fs,Min(TotalSize-NowSize,AThread.Connection.RecvBufferSize),False);  
  //*******问题就出在上面这行,我换过打开方式为fmCreate,也不行******  
          fs.Free;  
   
          //发送当前字节大小,如果已经完成,则发送FILEEND  
          fs:=TFileStream.Create('TestReceive.exe',fmOpenRead);  
          NowSize:=fs.Size;  
          If   NowSize>=TotalSize   Then   AThread.Connection.WriteLn('FILEEND')   Else  
          Begin  
              AThread.Connection.WriteLn(IntToStr(NowSize));  
          end;  
          fs.Free;  
   
          //发送提示继续  
          AThread.Connection.WriteLn('GOON');  
      end;  
   
   
  同问题发送在DELPHI的VCL版,up者1分,解决者最少50分。  
 

//解决者最少50分。  
  哇,利益驱动老冯,给你一段代码。

冯老前辈,我在等你的代码哦。如果你一下子就解决,就是100分哦,再在另一个帖子回复一下,就是200分哦。

靠   快无语了   抢分达人啊   老冯~~

不抢了。

没有人来,我就来。哼哼哈哈。  
   
  var  
      CurrentFile:   TFileStream   ;  
      NextFile:   TFileStream;  
      UpdateFile:   File;  
  begin  
      //建立一个临时文件  
      if   FileExists('NextTestReceive.exe')   then  
      begin  
          AssignFile(UpdateFile,'NextTestReceive.exe');  
          Rewrite(UpdateFile,1);  
          CloseFile(UpdateFile);  
      end;  
   
      CurrentFile   :=   TFileStream.Create('TestReceive.exe',fmOpenwrite);  
      CurrentFile.Seek(0,soFromEnd);  
   
      NextFile   :=   TFileStream.Create('NextTestReceive.exe',fmOpenRead);  
      AThread.Connection.ReadStream(NextFile,   -1,   True);//读  
      NextFile.Seek(0,   soFromBeginning);  
   
      CurrentFile.CopyFrom(NextFile,   NextFile.Size);   //追尾  
   
      CurrentFile.Free;  
      NextFile.Free;  
  end;

最好再加一句,删除临时文件

posted @ 2009-03-02 11:32 delphi2007 阅读(117) | 评论 (0)编辑 收藏

Delphi中如何进行HTTP编程,比如:发送一个XML文件给服务器? Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiNetwork/html/delphi_20061127032913245.html
Delphi中如何进行HTTP编程,比如:发送一个XML文件给服务器该如何写,大虾帮忙啊,有代码最好?

http://www.topxml.com/BizTalk/rn-132749_Post-an-xml-file-to-a-webpage.aspx

XML技术上传文件    
   
  为了在HTML网页中获得上传功能,在客户端我们可以使用如下格式的FORM:  
   
  <   FORM   NAME="myForm"   ACTION="TargetURL.asp"   ENCTYPE="multipart/form-data"METHOD="post"   >  
  <   INPUT   TYPE="file"   NAME="myFile"   >  
  <   INPUT   TYPE="submit"   VALUE="Upload   File"   >  
  <   /FORM   >  
   
    这种方案在客户端和服务器端的使用都有很多限制。首先,我们必须使用POST方法,因为GET方法无法处理这样的表单数据。并且,没有什么方法可以在不使用表单的情况下引发一个POST动作。把数据发送给表单处理程序后,浏览器将会把处理程序作为新页面加载,然后使用者会看到一个不讨人喜欢的页面转换过程。  
   
    ENCTYPE属性为表单定义了MIME编码方式,上传文件的表单的ENCTYPE属性必须使用“multipart/form-data”。把这个属性设置为“multipart/form-data”就创建了一个与传统结构不同的POST缓冲区(复合结构),ASP的Request对象无法访问这样的表单内容。所以,我们可以使用Request.binaryRead方法来访问这些数据,但是无法使用脚本语言来完成这一切。Request.binaryRead方法返回一个VTarray型数据(只包含无符号一字节字符的Variant型数组)。但是脚本语言只能处理Variant型数据。为了解决这个问题,只能使用专用的ASP上传组件,或者ISAPI扩展程序,比如CPSHOST.DLL。这是设计上的限制。  
   
  新的上传方案  
   
  需要按照如下步骤操作。  
  客户端:  
   
  使用MSXML   3.0创建一个XML文档  
  创建一个针对二进制内容的XML节点  
  使用ADO   Stream   object将上传的文件数据放入该节点  
  使用XMLHTTP对象把这个XML文档发送给Web服务器  
   
   
   
  服务器端:  
   
    从Request对象中读出XML文档读出二进制节点中的数据并且存储到服务器上的文件中。当然,我们也可以将其存储到数据库的BLOB型字段中。  
    在解释这段代码之前,我们可以对这个方案进行一些思考。  
   
  对XML的思考  
   
    XML格式支持很多数据类型,比如numeric,   float,   character等等。很多作者将XML定义为ASCII格式,但是我们不能忽视,XML技术还可以使用“bin.base64”数据类型来描述二进制信息。这个特性在MS   XML3.0解析器重得到完全的支持,但是目前还需要一些特别设置。该对象提供一些可以对二进制数据进行完全控制的属性:  
   
    obj_node.dataType   -   该可读写的属性定义了特定节点的数据类型。MSXML解析器支持更多的数据类型(参见MSDN:http://msdn.microsoft.com/library/psdk/xmlsdk/xmls3z1v.htm)  
  对于二进制数据,我们可以使用“bin.base64”类型。  
   
    obj_node.nodeTypedValue   -   该可读写属性包含了按照制定类型表示的指定节点的数据。  
  我们可以创建一个包含多个bin.base64类型节点的XML文档,节点中包含上传的文件。这点特性可以使用一个POST一次上传多个文件。  
   
    我们可以使用XMLHttpRequest对象和POST方法发送一个XML文档给Web服务器。该对象为HTTP服务器提供了客户端协议支持,允许在Web服务器上发送和接受MS   XMLDOM对象。XMLHttpRequest是Internet   Explorer   5内置的COM对象(不需要定制安装),并且发送完毕后无需转换页面。  
   
   
  对ADO   Stream对象的思考  
   
    我们可以在客户端创建一个包含一个或者多个二进制节点的XML文档。我们还必须把文件内容填入节点中。但是很不幸,脚本语言不能访问本地文件系统,并且Scripting.FileSystem对象(是Win32系统的内置对象)到目前为止还不能访问二进制文件。这是设计上的限制。所以我们需要另外找一个可以提供对本地二进制文件的访问的COM对象。  
   
    ADO   Stream对象(MDAC   2.5中的组件)提供了读、写和管理二进制流数据的手段。字节流的内容可以是文本,或者二进制数据,并且没有容量上的限制。在ADO   2.5中,Microsoft对Stream对象的介绍不属于ADO对象结构的任何一层,所以,我们无需捆绑即可使用该对象。  
   
    本文中使用Stream对象来访问文件内容,再把内容存入XML节点。  
   
  客户端  
   
  以下示例代码使用Stream和MSXML对象完成文件上传动作。  
   
  <   HTML   >  
  <   HEAD   ><   TITLE   >File   Send<   /TITLE   ><   /HEAD   >  
  <   BODY   >  
  <   INPUT   id=btn_send   name="btn_send"   type=button   value="FILE   SEND"   >  
  <   DIV   id=div_message   >Ready  
   
   
  <   /BODY   >  
  <   /HTML   >  
   
  <   SCRIPT   LANGUAGE=JavaScript   >  
   
  //   上传函数  
  function   btn_send.onclick()  
  {  
  //   创建   ADO-stream   对象  
  var   ado_stream   =   new   ActiveXObject("ADODB.Stream");  
   
  //   创建包含默认头信息和根节点的   XML文档  
  var   xml_dom   =   new   ActiveXObject("MSXML2.DOMDocument");  
  xml_dom.loadXML('   ');  
  //   指定数据类型  
  xml_dom.documentElement.setAttribute("xmlns:dt",   "urn:schemas-microsoft-com:datatypes");  
   
  //   创建一个新节点,设置其为二进制数据节点  
  var   l_node1   =   xml_dom.createElement("file1");  
  l_node1.dataType   =   "bin.base64";  
  //   打开Stream对象,读源文件  
  ado_stream.Type   =   1;   //   1=adTypeBinary    
  ado_stream.Open();    
  ado_stream.LoadFromFile("c:\\tmp\\myfile.doc");  
  //   将文件内容存入XML节点  
  l_node1.nodeTypedValue   =   ado_stream.Read(-1);   //   -1=adReadAll  
  ado_stream.Close();  
  xml_dom.documentElement.appendChild(l_node1);  
   
  //   可以创建多个二进制节点,一次上传多个文件  
   
  //   把XML文档发送到Web服务器  
  var   xmlhttp   =   new   ActiveXObject("Microsoft.XMLHTTP");  
  xmlhttp.open("POST","./file_recieve.asp",false);  
  xmlhttp.send(xml_dom);  
  //   显示服务器返回的信息  
  div_message.innerHTML   =   xmlhttp.ResponseText;  
  }  
  <   /SCRIPT   >  
   
  服务器端  
   
  以下代码使用相同的对象提供服务器端的上传处理功能。  
   
   
  <   %@   LANGUAGE=VBScript%   >  
  <   %   Option   Explicit  
  Response.Expires   =   0    
   
  '   定义变量和对象。  
  dim   ado_stream  
  dim   xml_dom  
  dim   xml_file1  
   
  '   创建   Stream   对象  
  set   ado_stream   =   Server.CreateObject("ADODB.Stream")  
  '   从Request对象创建   XMLDOM对象  
  set   xml_dom   =   Server.CreateObject("MSXML2.DOMDocument")  
  xml_dom.load(request)  
  '   读出包含二进制数据的节点  
  set   xml_file1   =   xml_dom.selectSingleNode("root/file1")  
   
  '   打开Stream对象,把数据存入其中    
  ado_stream.Type   =   1   '   1=adTypeBinary    
  ado_stream.open    
  ado_stream.Write   xml_file1.nodeTypedValue  
  '   文件存盘  
  ado_stream.SaveToFile   "c:\tmp\upload1.doc",2   '   2=adSaveCreateOverWrite    
  ado_stream.close  
   
  '   销毁对象    
  set   ado_stream   =   Nothing    
  set   xml_dom   =   Nothing  
  '   向浏览器返回信息  
  Response.Write   "Upload   successful!"  
  %   >  
   
  也可以使用Stream对象把数据放到数据库的BLOB型字段中。  
   
  使用该方法的益处  
   
  不引起页面转换。  
  不需要专用组件。  
  可同时上传多个文件。  
   
    这段程序是纯脚本写成的,可以很容易的插入到其他代码中,而不需要任何HTML对象的配合。还可以把这个逻辑在任何支持COM标准的语言中实现。  
   
  系统安全考虑  
   
    该方法只能使用于内部网络,因为它需要IE5的安全级别设置为“低”。必须:  
   
    允许脚本和ActiveX对象。该设置允许浏览器执行类似   "myobj   =   new   activexobject(...)"的   JScript语句;  
   
    必须允许穿越域访问数据源。这个设置允许在客户端使用Stream对象。还必须在服务器和客户端都安装MS   XML   DOM   3.0   和MDAC   2.5   。  
 

一般用Indy或ICS

谢谢zuoansuifeng大虾,问题是:发送的这些代码如果用DELPHI怎么写?不是用网页,服务器端不考虑,已经有ASP页面。  
   
   
   
  我就是要在DELPHI应用程序里实现以下代码(我记得VB里可以):  
   
  xmlhttp.open("POST","./file_recieve.asp",false);  
  xmlhttp.send(xml_dom);  
  div_message.innerHTML   =   xmlhttp.ResponseText;  
   
  暨使用   DELPHI语言实现向服务器端发送XML、并获取返回的XML串  
 

luxuewei5214大虾,谢谢。在DELPHI里,XMLDocument如何用以下或类似以下的方法:  
   
  xmlhttp.open("POST","./file_recieve.asp",false);  
  xmlhttp.send(xml_dom);  
  div_message.innerHTML   =   xmlhttp.ResponseText;

其实偶很菜啦   我也不知道怎么搞的一下就抢到1000多分了   纳闷了~~    
   
  Delphi   使用idhttp    
   
 

帮顶一下

posted @ 2009-03-02 11:32 delphi2007 阅读(278) | 评论 (0)编辑 收藏

C/S结构中如何实现服务端与客户端的同步,实现动态刷新 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiNetwork/html/delphi_20061127013343246.html
数据库:MS   SQL2000    
  服务端:ADOquery,ADOconnection,datasetprovider,DBGrid  
  客户端:clientdataset,datasource,DCOMConnection  
   
  问题1:如何实现   C与S的同步,比如说客户端提交数据时服务端就能马上刷新到服务端的某个控件上(比如说DBGrid控件就立即显示新的表内容)?  
   
  问题2:如何在客户端实现选择服务器列表?  
   
  问题3:我用的是MIDAS技术实现分布,现在一打开DCOMConnection的server   name就会出现一大堆,可很多都是没用的了~``我怎么删除那些没用的?  
   
 

关注...

1、三层的话,看看datasetprovider有没有触发事件,有的话可以通过这个来刷新显示,没有的话就只能通过时间控件来循环判断有没有新数据,有就刷新  
  2、什么意思?如果你有多个服务器的话,最好写入一个配置文件方便  
  3、没试过,应该是本机保存在某个地方吧

?

???????????????

posted @ 2009-03-02 11:32 delphi2007 阅读(270) | 评论 (0)编辑 收藏

delphi如何操作opc Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiNetwork/html/delphi_20061126181403247.html
小弟,初次使用opc,知道opc是基于com的技术,请问各位大侠使用opc还需要特殊操作吗?  
  这是我在网上下   载的例子,这段代码有什么问题?我总是运行不成功。  
  在HR   :=   GroupAddItem(GroupIf,   Item0Name,   0,   VT_EMPTY,   Item0Handle  
          ItemType);一句中,hr总是返回负值,请问为什么,另外在  
      HR   :=   GroupAdviseTime(GroupIf,   AdviseSink,   AsyncConnection);这一句总是提示   异常   接口不支持   interface   not   supportd,就是DataIf   :=   GroupIf   as   IDataObject;groupif   是   IOPCItemMgt类型的  
  源代码:  
    //   among   other   things,   this   call   makes   sure   that   COM   is   initialized  
      Application.Initialize;  
      Writeln('========================================================');  
      Writeln('Simple   OPC   client   program,   by   Mike   Dillamore,   1998-2006.');  
      Writeln('Tested   for   compatibility   with   Delphi   3-7   and   2005,   2006   ');  
      Writeln('Requires   Simulation   OPC   server   from   Matrikon,                       ');  
      Writeln('but   easily   modified   for   use   with   other   servers.                   ');  
      Writeln('========================================================');  
      Writeln;  
   
      //   this   is   for   DCOM:  
      //   without   this,   callbacks   from   the   server   may   get   blocked,   depending   on  
      //   DCOM   configuration   settings  
      HR   :=   CoInitializeSecurity(  
          nil,                                         //   points   to   security   descriptor  
          -1,                                           //   count   of   entries   in   asAuthSvc  
          nil,                                         //   array   of   names   to   register  
          nil,                                         //   reserved   for   future   use  
          RPC_C_AUTHN_LEVEL_NONE,   //   the   default   authentication   level   for   proxies  
          RPC_C_IMP_LEVEL_IMPERSONATE,//   the   default   impersonation   level   for   proxies  
          nil,                                         //   used   only   on   Windows   2000  
          EOAC_NONE,                             //   additional   client   or   server-side   capabilities  
          nil                                           //   reserved   for   future   use  
          );  
      if   Failed(HR)   then  
      begin  
          Writeln('Failed   to   initialize   DCOM   security');  
      end;  
   
      try  
          //   we   will   use   the   custom   OPC   interfaces,   and   OPCProxy.dll   will   handle  
          //   marshaling   for   us   automatically   (if   registered)  
          ServerIf   :=   CreateComObject(ProgIDToClassID(ServerProgID))   as   IOPCServer;  
      except  
          ServerIf   :=   nil;  
      end;  
      if   ServerIf   <>   nil   then  
      begin  
          Writeln('Connected   to   OPC   server');  
      end  
      else   begin  
          Writeln('Unable   to   connect   to   OPC   server');  
          Exit;  
      end;  
   
      //   now   add   a   group  
      HR   :=   ServerAddGroup(ServerIf,   'MyGroup',   True,   500,   0,   GroupIf,   GroupHandle);  
      if   Succeeded(HR)   then  
      begin  
          Writeln('Added   group   to   server');  
      end  
      else   begin  
          Writeln('Unable   to   add   group   to   server');  
          Exit;  
      end;  
   
      //   now   add   an   item   to   the   group  
      HR   :=   GroupAddItem(GroupIf,   Item0Name,   0,   VT_EMPTY,   Item0Handle,  
          ItemType);  
      if   Succeeded(HR)   then  
      begin  
          Writeln('Added   item   0   to   group');  
      end  
      else   begin  
          Writeln('Unable   to   add   item   0   to   group');  
          ServerIf.RemoveGroup(GroupHandle,   False);  
          Exit;  
      end;  
      //   now   add   a   second   item   to   the   group  
      HR   :=   GroupAddItem(GroupIf,   Item1Name,   1,   VT_EMPTY,   Item1Handle,  
          ItemType);  
      if   Succeeded(HR)   then  
      begin  
          Writeln('Added   item   1   to   group');  
      end  
      else   begin  
          Writeln('Unable   to   add   item   1   to   group');  
          ServerIf.RemoveGroup(GroupHandle,   False);  
          Exit;  
      end;  
   
      //   set   up   an   IDataObject   advise   callback   for   the   group  
      AdviseSink   :=   TOPCAdviseSink.Create;  
      HR   :=   GroupAdviseTime(GroupIf,   AdviseSink,   AsyncConnection);  
      if   Failed(HR)   then  
      begin  
          Writeln('Failed   to   set   up   IDataObject   advise   callback');  
      end  
      else   begin  
          Writeln('IDataObject   advise   callback   established');  
          //   continue   waiting   for   callbacks   for   10   seconds  
          StartTime   :=   Now;  
          while   (Now   -   StartTime)   <   (10   *   OneSecond)   do  
          begin  
              Application.ProcessMessages;  
          end;  
          //   end   the   IDataObject   advise   callback  
          GroupUnadvise(GroupIf,   AsyncConnection);  
      end;  
   
      //   now   set   up   an   IConnectionPointContainer   data   callback   for   the   group  
      OPCDataCallback   :=   TOPCDataCallback.Create;  
      HR   :=   GroupAdvise2(GroupIf,   OPCDataCallback,   AsyncConnection);  
      if   Failed(HR)   then  
      begin  
          Writeln('Failed   to   set   up   IConnectionPointContainer   advise   callback');  
      end  
      else   begin  
          Writeln('IConnectionPointContainer   data   callback   established');  
          //   continue   waiting   for   callbacks   for   10   seconds  
          StartTime   :=   Now;  
          while   (Now   -   StartTime)   <   (10   *   OneSecond)   do  
          begin  
              Application.ProcessMessages;  
          end;  
          //   end   the   IConnectionPointContainer   data   callback  
          GroupUnadvise2(GroupIf,   AsyncConnection);  
      end;  
   
      //   now   try   to   read   the   item   value   synchronously  
      HR   :=   ReadOPCGroupItemValue(GroupIf,   Item0Handle,   ItemValue,   ItemQuality);  
      if   Succeeded(HR)   then  
      begin  
          if   (ItemQuality   and   OPC_QUALITY_MASK)   =   OPC_QUALITY_GOOD   then  
          begin  
              Writeln('Item   0   value   read   synchronously   as   ',   ItemValue);  
          end  
          else   begin  
              Writeln('Item   0   value   was   read   synchronously,   but   quality   was   not   good');  
          end;  
      end  
      else   begin  
          Writeln('Failed   to   read   item   0   value   synchronously');  
      end;  
   
      //   finally   write   the   value   just   read   from   item   0   into   item   1  
      HR   :=   WriteOPCGroupItemValue(GroupIf,   Item1Handle,   ItemValue);  
      if   Succeeded(HR)   then  
      begin  
          Writeln('Item   1   value   written   synchronously');  
      end  
      else   begin  
          Writeln('Failed   to   write   item   1   value   synchronously');  
      end;  
   
      //   wait   for   1   second  
      StartTime   :=   Now;  
      while   (Now   -   StartTime)   <   OneSecond   do  
      begin  
          Application.ProcessMessages;  
      end;  
   
      //   and   try   to   read   it   back  
      HR   :=   ReadOPCGroupItemValue(GroupIf,   Item1Handle,   ItemValue,   ItemQuality);  
      if   Succeeded(HR)   then  
      begin  
          if   (ItemQuality   and   OPC_QUALITY_MASK)   =   OPC_QUALITY_GOOD   then  
          begin  
              Writeln('Item   1   value   read   synchronously   as   ',   ItemValue);  
          end  
          else   begin  
              Writeln('Item   1   value   was   read   synchronously,   but   quality   was   not   good');  
          end;  
      end  
      else   begin  
          Writeln('Failed   to   read   item   0   value   synchronously');  
      end;  
   
      //   now   cleanup  
      HR   :=   ServerIf.RemoveGroup(GroupHandle,   False);  
      if   Succeeded(HR)   then  
      begin  
          Writeln('Removed   group');  
      end  
      else   begin  
          Writeln('Unable   to   remove   group');  
      end;  
   
      //   Delphi   runtime   library   will   release   all   interfaces   automatically   when  
      //   variables   go   out   of   scope  
 

 
  function   ServerAddGroup(ServerIf:   IOPCServer;   Name:   string;   Active:   BOOL;  
                      UpdateRate:   DWORD;   ClientHandle:   OPCHANDLE;   var   GroupIf:   IOPCItemMgt;  
                      var   ServerHandle:   OPCHANDLE):   HResult;  
  function   GroupAddItem(GroupIf:   IOPCItemMgt;   ItemID:   string;  
                      ClientHandle:   OPCHANDLE;   DataType:   TVarType;  
                      var   ServerHandle:   OPCHANDLE;   var   CanonicalType:   TVarType):   HResult;  
  function   GroupRemoveItem(GroupIf:   IOPCItemMgt;  
                      ServerHandle:   OPCHANDLE):   HResult;  
  function   GroupAdviseTime(GroupIf:   IUnknown;   Sink:   IAdviseSink;  
                      var   AsyncConnection:   Longint):   HResult;  
  function   GroupUnAdvise(GroupIf:   IUnknown;   AsyncConnection:   Longint):   HResult;  
  function   GroupAdvise2(GroupIf:   IUnknown;   OPCDataCallback:   IOPCDataCallback;  
                      var   AsyncConnection:   Longint):   HResult;  
  function   GroupUnadvise2(GroupIf:   IUnknown;  
                      var   AsyncConnection:   Longint):   HResult;  
  function   ReadOPCGroupItemValue(GroupIf:   IUnknown;   ItemServerHandle:   OPCHANDLE;  
                      var   ItemValue:   string;   var   ItemQuality:   Word):   HResult;  
  function   WriteOPCGroupItemValue(GroupIf:   IUnknown;   ItemServerHandle:   OPCHANDLE;  
                      ItemValue:   OleVariant):   HResult;  
   
  implementation  
   
  //   utility   functions   wrapping   OPC   methods  
   
  //   wrapper   for   IOPCServer.AddGroup  
  function   ServerAddGroup(ServerIf:   IOPCServer;   Name:   string;   Active:   BOOL;  
                      UpdateRate:   DWORD;   ClientHandle:   OPCHANDLE;   var   GroupIf:   IOPCItemMgt;  
                      var   ServerHandle:   OPCHANDLE):   HResult;  
  var  
      PercentDeadBand:   Single;  
      RevisedUpdateRate:   DWORD;  
  begin  
      Result   :=   E_FAIL;  
      if   ServerIf   <>   nil   then  
      begin  
          PercentDeadBand   :=   0.0;  
          Result   :=   ServerIf.AddGroup(PWideChar(WideString(Name)),   Active,   UpdateRate,  
                                                          ClientHandle,   nil,   @PercentDeadBand,   0,  
                                                          ServerHandle,   RevisedUpdateRate,   IOPCItemMgt,  
                                                          IUnknown(GroupIf));  
      end;  
      if   Failed(Result)   then  
      begin  
          GroupIf   :=   nil;  
      end;  
  end;  
   
  //   wrapper   for   IOPCItemMgt.AddItems   (single   item   only)  
  function   GroupAddItem(GroupIf:   IOPCItemMgt;   ItemID:   string;  
                      ClientHandle:   OPCHANDLE;   DataType:   TVarType;  
                      var   ServerHandle:   OPCHANDLE;   var   CanonicalType:   TVarType):   HResult;  
  var  
      ItemDef:   OPCITEMDEF;  
      Results:   POPCITEMRESULTARRAY;  
      Errors:   PResultList;  
  begin  
      if   GroupIf   =   nil   then  
      begin  
          Result   :=   E_FAIL;  
          Exit;  
      end;  
      with   ItemDef   do  
      begin  
          szAccessPath   :=   '';  
          szItemID   :=   PWideChar(WideString(ItemID));  
          bActive   :=   True;  
          hClient   :=   ClientHandle;  
          dwBlobSize   :=   0;  
          pBlob   :=   nil;  
          vtRequestedDataType   :=   DataType;  
      end;  
      Result   :=   GroupIf.AddItems(1,   @ItemDef,   Results,   Errors);  
      if   Succeeded(Result)   then  
      begin  
          //Result   :=   Errors[0];  
          try  
              if   Succeeded(Result)   then  
              begin  
                  ServerHandle   :=   Results[0].hServer;  
                  CanonicalType   :=   Results[0].vtCanonicalDataType;  
              end;  
          finally  
              CoTaskMemFree(Results[0].pBlob);  
              CoTaskMemFree(Results);  
              CoTaskMemFree(Errors);  
          end;  
      end;  
  end;

//   wrapper   for   IOPCItemMgt.RemoveItems   (single   item   only)  
  function   GroupRemoveItem(GroupIf:   IOPCItemMgt;  
                      ServerHandle:   OPCHANDLE):   HResult;  
  var  
      Errors:   PResultList;  
  begin  
      if   GroupIf   =   nil   then  
      begin  
          Result   :=   E_FAIL;  
          Exit;  
      end;  
      Result   :=   GroupIf.RemoveItems(1,   @ServerHandle,   Errors);  
      if   Succeeded(Result)   then  
      begin  
          Result   :=   Errors[0];  
          CoTaskMemFree(Errors);  
      end;  
  end;  
   
  //   wrapper   for   IDataObject.DAdvise   on   an   OPC   group   object  
  function   GroupAdviseTime(GroupIf:   IUnknown;   Sink:   IAdviseSink;  
                      var   AsyncConnection:   Longint):   HResult;  
  var  
      DataIf:   IDataObject;  
      Fmt:   TFormatEtc;  
  begin  
      Result   :=   E_FAIL;  
      try  
          DataIf   :=   GroupIf   as   IDataObject;  
      except  
          DataIf   :=   nil;  
      end;  
      if   DataIf   <>   nil   then  
      begin  
          with   Fmt   do  
          begin  
              cfFormat   :=   OPCSTMFORMATDATATIME;  
              dwAspect   :=   DVASPECT_CONTENT;  
              ptd   :=   nil;  
              tymed   :=   TYMED_HGLOBAL;  
              lindex   :=   -1;  
          end;  
          AsyncConnection   :=   0;  
          Result   :=   DataIf.DAdvise(Fmt,   ADVF_PRIMEFIRST,   Sink,   AsyncConnection);  
          if   Failed(Result)   then  
          begin  
              AsyncConnection   :=   0;  
          end;  
      end;  
  end;  
   
  //   wrapper   for   IDataObject.DUnadvise   on   an   OPC   group   object  
  function   GroupUnAdvise(GroupIf:   IUnknown;   AsyncConnection:   Longint):   HResult;  
  var  
      DataIf:   IDataObject;  
  begin  
      Result   :=   E_FAIL;  
      try  
          DataIf   :=   GroupIf   as   IDataObject;  
      except  
          DataIf   :=   nil;  
      end;  
      if   DataIf   <>   nil   then  
      begin  
          Result   :=   DataIf.DUnadvise(AsyncConnection);  
      end;  
  end;  
   
  //   wrapper   for   setting   up   an   IOPCDataCallback   connection  
  function   GroupAdvise2(GroupIf:   IUnknown;   OPCDataCallback:   IOPCDataCallback;  
                      var   AsyncConnection:   Longint):   HResult;  
  var  
      ConnectionPointContainer:   IConnectionPointContainer;  
      ConnectionPoint:   IConnectionPoint;  
  begin  
      Result   :=   E_FAIL;  
      try  
          ConnectionPointContainer   :=   GroupIf   as   IConnectionPointContainer;  
      except  
          ConnectionPointContainer   :=   nil;  
      end;  
      if   ConnectionPointContainer   <>   nil   then  
      begin  
          Result   :=   ConnectionPointContainer.FindConnectionPoint(IID_IOPCDataCallback,  
              ConnectionPoint);  
          if   Succeeded(Result)   and   (ConnectionPoint   <>   nil)   then  
          begin  
              Result   :=   ConnectionPoint.Advise(OPCDataCallback   as   IUnknown,  
                  AsyncConnection);  
          end;  
      end;  
  end;  
   
  //   wrapper   for   cancelling   up   an   IOPCDataCallback   connection  
  function   GroupUnadvise2(GroupIf:   IUnknown;  
                      var   AsyncConnection:   Longint):   HResult;  
  var  
      ConnectionPointContainer:   IConnectionPointContainer;  
      ConnectionPoint:   IConnectionPoint;  
  begin  
      Result   :=   E_FAIL;  
      try  
          ConnectionPointContainer   :=   GroupIf   as   IConnectionPointContainer;  
      except  
          ConnectionPointContainer   :=   nil;  
      end;  
      if   ConnectionPointContainer   <>   nil   then  
      begin  
          Result   :=   ConnectionPointContainer.FindConnectionPoint(IID_IOPCDataCallback,  
              ConnectionPoint);  
          if   Succeeded(Result)   and   (ConnectionPoint   <>   nil)   then  
          begin  
              Result   :=   ConnectionPoint.Unadvise(AsyncConnection);  
          end;  
      end;  
  end;  
   
  //   wrapper   for   IOPCSyncIO.Read   (single   item   only)  
  function   ReadOPCGroupItemValue(GroupIf:   IUnknown;   ItemServerHandle:   OPCHANDLE;  
                      var   ItemValue:   string;   var   ItemQuality:   Word):   HResult;  
  var  
      SyncIOIf:   IOPCSyncIO;  
      Errors:   PResultList;  
      ItemValues:   POPCITEMSTATEARRAY;  
  begin  
      Result   :=   E_FAIL;  
      try  
          SyncIOIf   :=   GroupIf   as   IOPCSyncIO;  
      except  
          SyncIOIf   :=   nil;  
      end;  
      if   SyncIOIf   <>   nil   then  
      begin  
          Result   :=   SyncIOIf.Read(OPC_DS_CACHE,   1,   @ItemServerHandle,   ItemValues,  
                                                          Errors);  
          if   Succeeded(Result)   then  
          begin  
              Result   :=   Errors[0];  
              CoTaskMemFree(Errors);  
              ItemValue   :=   VarToStr(ItemValues[0].vDataValue);  
              ItemQuality   :=   ItemValues[0].wQuality;  
              VariantClear(ItemValues[0].vDataValue);  
              CoTaskMemFree(ItemValues);  
          end;  
      end;  
  end;  
   
  //   wrapper   for   IOPCSyncIO.Write   (single   item   only)  
  function   WriteOPCGroupItemValue(GroupIf:   IUnknown;   ItemServerHandle:   OPCHANDLE;  
                      ItemValue:   OleVariant):   HResult;  
  var  
      SyncIOIf:   IOPCSyncIO;  
      Errors:   PResultList;  
  begin  
      Result   :=   E_FAIL;  
      try  
          SyncIOIf   :=   GroupIf   as   IOPCSyncIO;  
      except  
          SyncIOIf   :=   nil;  
      end;  
      if   SyncIOIf   <>   nil   then  
      begin  
          Result   :=   SyncIOIf.Write(1,   @ItemServerHandle,   @ItemValue,   Errors);  
          if   Succeeded(Result)   then  
          begin  
              Result   :=   Errors[0];  
              CoTaskMemFree(Errors);  
          end;  
      end;  
  end;

没看完,太长。。。。

我把问题换换吧,怎么用delphi做opc服务器

delphi怎么做opc?  
 

帮你顶!看花眼了!

应该有这方面的资料,从网上搜一下吧

完全看不懂

我有源代码,发给你

posted @ 2009-03-02 11:32 delphi2007 阅读(426) | 评论 (0)编辑 收藏

数据采集源码(idhttp,WebBrowser技术),低价转让,代理采集数据!! Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiNetwork/html/delphi_20061126155704248.html
本人失业中欲想低价出售自己开发的delphi数据采集源码(可以发DEMO试用),  
  适合有规则的网页数据采集,本人也可以帮你采集数据,价格从优,  
  有意者请加QQ:380199807,一天内必有回复!!

有情支持!!可以发给源代码来看看么?

我对数据采集有兴趣  
  发你的demo过来看看  
  Dragon18888@163.com

发个给我cowbo@163.com

我也有需求,发个我看一下,如果行的话,我们可以好好配合.

我也有需求,发个我看一下,如果行的话,我们可以好好配合,刚才忘了留email:  
  gxye001@126.com

感谢各位支持,有油箱的我都发DOME过去了,请查收!!

本人现在有个相关的项目,可以考虑合作。  
  dayu_liang@sohu.com

请发送,谢谢邮箱:418@qingdaonews.com

先给我个DEMO看看,谢谢!~!~  
  yangsf004@163.com

flzkb@163.com

呵呵,我也正在做呢,我的程序是BFC论坛采集器,我正在开发后续版本,有没有兴趣共同开发?  
  EMail:gxch2001@yahoo.com.cn

我正有这方面的需求,请发个DEMO过来看看,谢谢。songyuanwen@126.com

给我一个Demo吧,li_xiao_zhong@163.com,谢谢!

我也在做一个程序,是关于web上的数据的采集,发个我看一下,如果行的话,那非常感谢!  
  linyuhan1983@yahoo.com.cn

请发个Demo吧,我也不兴趣,Ywxpeter@163.com,谢谢!

请发个demo,我这要做着东西呢。看客不可以合作。  
  wulengbing@163.com

我也想要  
  但我要求是:  
  1:支持https协议  
  2:复杂的框架网页也能采集到数据  
  如果可以的话,就发个DEMO到我邮箱.到时我们电话联系.

我的邮箱是:believetech@163.com

我有这个需要,发一个demo给我!谢谢!hzdavid2008@163.com

自己分析要采集数据的网业  
  用WebBrowser和IdHTTP集合起来使用  
  也不是很难的  
 

posted @ 2009-03-02 11:32 delphi2007 阅读(1044) | 评论 (3)编辑 收藏

DELPHI中如何删除已经注册的MIDAS Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiNetwork/html/delphi_20061126153109249.html
2:当我开发服务端的时候DELPHI7自动编译并运行该服务器程序。运行该程序即注册了一个MIDAS的服务器~`由于我是新手实验了好几个,所以就注册了好几个MIDAS请问如何删除机器上的MIDAS??

???????????

不太明白楼主的意思。可以在windows注册表编辑器里搜索serverName关键字,删除相关项。不止一处。(在你的另一贴亦这样回了,仅供参考)

我用的是MIDAS技术实现分布,现在一打开DCOMConnection的server   name就会出现一大堆,可很多都是没用的了~``我怎么删除那些没用的?  
 

可以在windows注册表编辑器里搜索serverName关键字,删除相关项。不止一处。  
   
  抱歉,别的办法我不知道

serverName关键字是指你注册的“Server   Name”。主键、值项全删

直接在系统里就可以删除了吧,控制面版-管理工具-组件服务-组件服务-计算机-我的电脑-下dcom或com+

posted @ 2009-03-02 11:32 delphi2007 阅读(336) | 评论 (0)编辑 收藏

关于远程屏幕抓取的问题。 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiNetwork/html/delphi_20061126151028250.html
我用CS,和CC   做了一个远程屏幕抓去的程序,在本地127.0.0.1测试通过,没有任何问题。  
   
  但是,当来到另一台机子上就不行了,已确定连接成功,但就是传输不了~  
   
  也没有错误提示。  
   
  这是怎么回事?

说错了,是用:ServerSocket   和   ClientSocket

防火墙?

已解决,原因是速度太慢,而不是传输不了。

posted @ 2009-03-02 11:32 delphi2007 阅读(242) | 评论 (0)编辑 收藏

仅列出标题
共34页: First 7 8 9 10 11 12 13 14 15 Last