delphi2007 教程

delphi2007 教程

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

#

后台服务怎样与前台交互? Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiAPI/html/delphi_20061116113741221.html
ShellWindow:   IShellWindows;  
   
  ShellWindow   :=   CoShellWindows.Create;  
   
  在一般进程中没有问题,可以用。  
   
  但是我用服务的方式,就出错了。请问各位高手,该怎么办?  
  服务是用dll方式实现的,不是exe。

没人会还是行不通?

ShellWindow:   IShellWindows;  
   
  ShellWindow   :=   CoShellWindows.Create;  
   
  这个东西,木用过,不过看名字,在DLL中使用貌似要注册,如果是,用CoInitialize(nil)注册,然后用CoUninitialize卸载。

楼上的老兄(貌似你比我大:)  
  不是这个问题。

怎么没人来解答了啊。

>>后台服务怎样与前台交互?  
   
  用name   pipe最方便

暂时不需要这方面的了,多谢两位的热心回答

posted @ 2009-02-03 09:50 delphi2007 阅读(570) | 评论 (1)编辑 收藏

用DELPHI代码的方式清理cookies,如何实现,比较急,高分送出。分不够,再给加,顶者有分 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiAPI/html/delphi_20061116105108222.html
用DELPHI代码的方式清理cookies,如何实现,比较急,高分送出。分不够,再给加,顶者有分

原理:  
  CMD下:  
  DEL/Q   "C:\Documents   and   Settings\<用户名>\Cookies  
   
  用winexec吧!

顶呀。还有没有更好的法了。。。最好是代码给我,我急用。

顶顶~  
 

1楼已经说了啊

uses  
      shlobj;  
   
  {$R   *.dfm}  
   
  function   GetSpecialFolder(const   CSIDL   :   integer)   :   string;  
  var  
      RecPath   :   PAnsiChar;  
  begin  
      RecPath   :=   StrAlloc(MAX_PATH);  
      try  
          FillChar(RecPath^,MAX_PATH,0);  
          if   SHGetSpecialFolderPath(0,RecPath,CSIDL,false)   then   begin  
            result   :=   RecPath;  
          end   else   result   :=   '';  
      finally  
          StrDispose(RecPath);  
      end;  
  end;  
   
  procedure   DelFiles(const   Directory:   string);  
  var  
      DirInfo:   TSearchRec;  
      Finder:   Integer;  
      Dir:   string;  
  begin  
      Dir   :=   Directory;  
      Finder   :=   FindFirst(Dir+'\*.*',   FaAnyfile,   DirInfo);  
      while   Finder   =   0   do  
      begin  
          DeleteFile(PChar(Dir+'\'+DirInfo.Name));  
          Finder   :=   FindNext(DirInfo);  
      end;  
      FindClose(DirInfo);  
  end;  
   
  procedure   TForm1.BtnDelCookiesClick(Sender:   TObject);  
  begin  
      DelFiles(GetSpecialFolder(CSIDL_COOKIES));  
  end;  
   
  结贴   sanmaotuo(老冯)   (100)、

SZ

posted @ 2009-02-03 09:50 delphi2007 阅读(265) | 评论 (0)编辑 收藏

运行两个或多个实例 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiAPI/html/delphi_20061116093635223.html
如何避免一个程序同时运行两个或多个实例?

参考:http://www.zahui.com/html/2/5251.htm  
   
  使用互斥对象让程序只运行一次  
  “怎么让我的程序在运行时不能重复打开?”经常在论坛上看到有朋友问这方面的问题。本文将比较详细的说明这一问题,并给出一个较为完善的解决方案。  
   
  尽管这已经不是一个新问题了,但这里还是简要的说明一下这种技术:这的确是一个相当有用的技术,可能你经常会注意到相当多的程序在运行之后当你再次点击运行时,它只是会回到原来的窗口,而不会运行两个程序。就如同你在运行delphi时,在外部点开另一个工程文件时,delphi只是会简单的将你的当前工程置换而不是运行两个delphi。这样的好处是显而易见的:你不必担心你的程序在某些情况下被别的软件恶意运行多次而吃光内存造成当机。下面我们做进一部的说明:  
   
  熟悉win32编程的朋友(特别是多线程编程),相信对互斥对象已经相当熟悉了,它常被用做线程间同步的技术手段。这里我们使用它来防止程序重复运行。我们只是简要的提一下互斥对象,并不做深入研究:互斥对象把第一次建立它的程序作为主程序,这样我们只用检测互斥对象是否已经有主程序就判断程序是否已经运行过,这里需要涉及到一个api函数:WaitForSingleObject该函数的第一个参数为用以检测的互斥对象,第2个参数的表示函数返回结果前的滞留时间,如果改函数返回wait_TimeOut就表明互斥对象已经有了一个主程序。修改了的工程文件代码如下:(注意:以下的代码都出现在工程文件中,而不是单元文件中,并且这里都在最简单的delphi默认建立的工程基础上修改)  
   
  var  
   
    myMutex:HWND;  
   
  begin  
   
      myMutex:=CreateMutex(nil,false,'hkOneCopy');//   CreateMutex建立互斥对象,并且给互斥对象起一个唯一的名字。  
   
      if   WaitForSingleObject(myMutex,0)<>wait_TimeOut   then//程序没有被运行过  
   
      begin  
   
        Application.Initialize;  
   
        Application.CreateForm(TForm1,   Form1);  
   
        Application.Run;  
   
      End;  
   
  End;  
   
  下面的工作是来完善这个程序,我们不仅希望程序可以不被重复运行,而且我们也希望当用户再次点击程序可执行文件时,已经运行的程序能够做出一些响应。在这里我们希望它能够变为最上层的活动窗口以提醒用户程序已经被运行。为了达到这个目的,我们必须先获得已经运行程序的窗口句柄,以便使用SetForeGroundWindow(handle)来使程序窗口最前并激活。为了得到这个句柄,我们必须使用windows枚举函数EnumWindows来遍历windows的窗口列表,该函数可以使用一个回调函数作为参数,并用这个回调函数来对每一个系统中的窗口进行调用直到最后一个窗口或回调函数返回false为止,这个回调函数规定有两个参数(handle,Cardinal,只用注意第一个handle参数它表示由枚举函数当前遍历到的窗口句柄)。我们只要编写这个函数并在其中不断的比较当前遍历到的窗口类名和我们的程序的主窗口类名,以及比较窗口可执行文件的名称和我们程序的名称直到找到相同的为止,将这时的窗口句柄保存下来就可以了,下面的代码加上了适当的注释:  
   
  function   EnumWndProc(hwnd:Thandle;param:Cardinal):bool;stdcall;  
   
  //由于用于api回调函数,请使用windows传统的参数传递方式stdcall  
   
  var  
   
    ClassName,WinMoudleName:string;  
   
    WinInstance:THandle;  
   
  begin  
   
    result:=true;  
   
    SetLength(ClassName,100);  
   
    GetClassName(hwnd,pchar(ClassName),length(ClassName));//获得当前遍历窗口的类名  
   
    ClassName:=pchar(ClassName);//在字符串后加结束符,确定字符串结束  
   
    if   ClassName=TForm1.ClassName   then//比较  
   
    begin  
   
      WinInstance:=GetWindowLong(hwnd,GWL_HINSTANCE);//获得当前遍历窗口的实例  
   
      setlength(WinMoudleName,100);  
   
      GetModuleFileName(WinInstance,pchar(WinMoudleName),length(WinMoudleName));  
   
      //获得当前遍历窗口的程序文件名  
   
      WinMoudleName:=pchar(WinMoudleName);  
   
      if   WinMoudleName=MoudleName   then//MoudleName为工程全局变量,自身程序的文件名  
   
      begin  
   
        FindHid:=hwnd;//FindHid为工程全局变量保存找到的句炳  
   
        result:=false;//找到以后就结束遍历  
   
      end;  
   
    end;  
   
  end;  
   
  下面是全部的工程文件:  
   
  var  
   
    hMutex,FindHid:HWND;  
   
    MoudleName:string;  
   
  begin  
   
      hMutex:=CreateMutex(nil,false,'hkOneCopy');  
   
      if   WaitForSingleObject(hMutex,0)<>wait_TimeOut   then  
   
      begin  
   
        ……//略去的代码在前文  
   
      end  
   
      else  
   
      begin  
   
        SetLength(MoudleName,100);  
   
        GetModuleFileName(HInstance,pchar(MoudleName),length(MoudleName));  
   
        //获得自己程序文件名  
   
        MoudleName:=pchar(MoudleName);  
   
        EnumWindows(@EnumWndProc,0);//调用枚举函数  
   
        if   FindHid<>0   then  
   
          SetForegroundWindow(FindHid);  
   
      end;  
   
  end.  
   
  为了使我们的程序更完美,让它能在重复运行的时候展现更多的特性(如delphi中的置换工程文件为当前打开的工程),你还可以向找到的窗口句柄发送用户消息,再在窗口的消息处理函数中做相应的处理,你一定可以让我们的程序更眩!  
   
  参考文献:  
   
        《delphi开发者指南》  
 

program   Project1;  
   
  uses  
      Forms,   Windows,  
      Unit1   in   'Unit1.pas'   {Form1};  
   
  var  
      hMutex:THandle;  
   
  {$R   *.res}  
   
  begin  
      hMutex:=OpenMutex(MUTEX_ALL_ACCESS,true,'TestMutex');  
      if   hMutex<>0   then  
      begin  
          Application.Terminate;  
      end;  
      Application.Initialize;  
      CreateMutex(MUTEX_ALL_ACCESS,false,'TestMutex');  
      Application.CreateForm(TForm1,   Form1);  
      Application.Run;  
  end.

上面的代码修改一下,加一个Exit;  
  hMutex:=OpenMutex(MUTEX_ALL_ACCESS,true,'TestMutex');  
      if   hMutex<>0   then  
      begin  
          Application.Terminate;  
          Exit;  
      end;  
      Application.Initialize;  
      CreateMutex(nil,false,'TestMutex');  
      Application.CreateForm(TForm1,   Form1);  
      Application.Run;

posted @ 2009-02-03 09:50 delphi2007 阅读(363) | 评论 (0)编辑 收藏

如何用findwindowex遍历某个窗口里的所有子窗口? Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiAPI/html/delphi_20061115233321224.html
如何用findwindowex遍历某个窗口里的所有子窗口?

用EnumWindows

同意老之,枚举窗口  
   
  这么晚还没睡?楼上大哥!

枚举子窗口:  
  EnumChildWindows

主  题:     如何用findwindowex遍历某个窗口里的所有子窗口?      
  作  者:     gyhong   (gyhong)                 Blog      
  等  级:          
  信   誉   值:     30      
     
   
  30分,基本可以肯定是不揭帖的主。

posted @ 2009-02-03 09:50 delphi2007 阅读(3162) | 评论 (0)编辑 收藏

Delphi调用VC编译的DLL Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiAPI/html/delphi_20061115223555225.html
尝试用Delphi调用VC编译的DLL,DLL接口函数中定义一般类型的参数时,可以正常调用,但是当在接口函数中定义回调函数时,在Delphi中将函数指针传入接口函数时总是报错,用Delphi创建同样功能的DLL,就没有问题,请高手指教!另外,接口函数和回调函数都已用stdcall声明

>>在Delphi中将函数指针传入接口函数时总是报错  
   
  什么样的错呀?  
   
  贴一你函数声明的相关代码,包括回调函数的声明

关于DELPHI和VC编写的DLL互相调用的问题,你可以搜索以前的帖子。

posted @ 2009-02-03 09:50 delphi2007 阅读(457) | 评论 (0)编辑 收藏

如何反查.DLL的函数?谢谢。。。 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiAPI/html/delphi_20061115213413226.html
如题。扣谢。

1.用depends.exe工具来查  
   
  2.如果要自己写程序的话,那就从dll的pe头,分析导出表

有很多工具,ExeScope,DumpBin,TDump,  
  都可以。  
  简易的用Exe   Scope就可以了。

有能查出参数的就好了。

谢谢,我继续努力啦。结贴

posted @ 2009-02-03 09:50 delphi2007 阅读(289) | 评论 (0)编辑 收藏

创建共享目录权限问题 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiAPI/html/delphi_20061115131918227.html
我想通过代码实现设置一个文件夹为共享目录,然后怎么用代码写共享目录权限呢,例如完全控制,只读,修改等,希望能给我一个完整的代码小例子,谢谢各位老大

api,    
  注册表   ,  
  windows   系统命令     (     net..   )  
  etc.

www.richsearch.com  
  搜索NetShareAdd

创建共享目录我已经实现了,就是设置权限没有实现,NetShareAdd本身带的设置权限的那个参数是个常量,在DELPHI中不好用  
 

权限常量描述:  
   
  //   TRUSTEE_ACCESS   flags  
  //  
  #define   TRUSTEE_ACCESS_ALLOWED             0x00000001L  
  #define   TRUSTEE_ACCESS_READ                   0x00000002L  
  #define   TRUSTEE_ACCESS_WRITE                 0x00000004L  
   
  #define   TRUSTEE_ACCESS_EXPLICIT           0x00000001L  
  #define   TRUSTEE_ACCESS_READ_WRITE       (TRUSTEE_ACCESS_READ   |                                     \  
                                                                            TRUSTEE_ACCESS_WRITE)  
   
   
  #define   TRUSTEE_ACCESS_ALL                     0xFFFFFFFFL

http://www.delphibbs.com/delphibbs/dispq.asp?lid=651376  
  下面的两个函数分别对文件和共享资源添加访问权限,在   D6   +   Win2kSvr   中通过。注意  
  AddFileAccessRights   也可对目录操作。  
   
  const  
      ACL_REVISION   =   2;  
      ACL_REVISION2   =   2;  
      netapi32lib   =   'Netapi32.dll';  
   
  Type  
      NET_API_STATUS   =   Integer;  
   
      PShare_Info_502   =   ^TShare_Info_502;  
      TShare_Info_502   =   record  
          shi502_netName:   PWideChar;  
          shi502_type:   DWORD;  
          shi502_remark:   PWideChar;  
          shi502_permissions:   DWORD;  
          shi502_max_uses:   DWORD;  
          shi502_current_uses   :   DWORD;  
          shi502_path:   PWideChar;  
          shi502_passwd:   PWideChar;  
          shi502_reserved:   DWORD;  
          shi502_security_descriptor:   PSECURITY_DESCRIPTOR;  
      end;  
   
      ACE_HEADER   =   record  
          AceType:   Byte;  
          AceFlags:   Byte;  
          AceSize:   Word;  
      end;  
   
      ACCESS_ALLOWED_ACE   =   record  
          Header:ACE_HEADER;  
          Mask:ACCESS_MASK;  
          SidStart:DWORD;  
      end;  
   
      ACL_SIZE_INFORMATION   =   record  
          AceCount:   DWORD;  
          AclBytesInUse:   DWORD;  
          AclBytesFree:   DWORD;  
      end;  
   
      PACE_HEADER   =   ^ACE_HEADER;  
   
  function   NetApiBufferFree(Buffer:   Pointer):   NET_API_STATUS;   stdcall   external   netapi32lib;  
  function   NetShareGetInfo(servername:   LPWSTR;   netname:   LPWSTR;   level:   DWORD;  
          var   butptr:   Pointer):   NET_API_STATUS;   stdcall;   external   netapi32lib;  
  function   NetShareSetInfo(servername:   LPWSTR;   netname:   LPWSTR;   leve:   DWORD;  
        const   buf:   Pointer;   parm_err:   PDWORD):   NET_API_STATUS;   stdcall;   external   netapi32lib;  
   
 

//添加文件、目录访问权限,对应于对象属性页中"安全"   页中的设置  
  function   AddFileAccesRights(const   FileName,   UserName:   string;  
      dwAccessMask:   DWORD):   boolean;  
  var  
      //   SID   variables  
      snuType   :   SID_NAME_USE;  
      szDomain   :   PChar;  
      cbDomain:   DWORD;  
      pUserSID:   Pointer;  
      cbUserSID:   DWORD;  
      //   File   SD   variables.  
      pFileSD:   PSECURITY_DESCRIPTOR;  
      cbFileSD:   DWORD;  
      //   New   SD   variables.  
      pNewSD:   PSECURITY_DESCRIPTOR;  
      //   ACL   variables.  
      p_ACL   :   PACL;  
      fDaclPresent,   fDaclDefaulted   :   LongBool;  
      AclInfo:   ACL_SIZE_INFORMATION;  
      //   New   ACL   variables.  
      pNewACL   :   PACL;  
      cbNewACL:   DWORD;  
      //   Temporary   ACE.  
      pTempAce:   Pointer;  
      CurrentAceIndex   :   Cardinal;  
  begin  
      szDomain   :=   nil;  
      cbDomain   :=   0;  
      pUserSID   :=   nil;  
      cbUserSID   :=   0;  
      pFileSD   :=   nil;  
      cbFileSD   :=   0;  
      pNewSD   :=   nil;  
      p_ACL   :=   nil;  
      pNewACL   :=   nil;  
      pTempAce   :=   nil;  
   
      //  
      //   STEP   1:   Get   SID   for   given   user.  
      //  
      Result   :=   LookupAccountName(nil,   PChar(UserName),  
          pUserSID,   cbUserSID,   szDomain,   cbDomain,   snuType);  
   
      //   API   should   have   failed   with   insufficient   buffer.  
      if   (not   Result)   and   (GetLastError   <>   ERROR_INSUFFICIENT_BUFFER)   then  
          RaiseLastWin32Error;  
   
      pUserSID   :=   AllocMem(cbUserSID);  
      szDomain   :=   AllocMem(cbDomain);  
      try  
          Result   :=   LookupAccountName(nil,   PChar(UserName),  
                pUserSID,   cbUserSID,   szDomain,   cbDomain,   snuType);  
   
          if   (not   Result)   then  
              RaiseLastWin32Error;  
   
          //   STEP   2:   Get   security   descriptor   (SD)   for   file.  
          Result   :=   GetFileSecurity(PChar(FileName),  
              DACL_SECURITY_INFORMATION,   pFileSD,   0,   cbFileSD);  
   
          if   (not   Result)   and   (GetLastError   <>   ERROR_INSUFFICIENT_BUFFER)   then  
              RaiseLastWin32Error;  
   
          pFileSD   :=   AllocMem(cbFileSD);  
   
          Result   :=   GetFileSecurity(PChar(FileName),  
              DACL_SECURITY_INFORMATION,   pFileSD,   cbFileSD,   cbFileSD);  
          if   (not   Result)   then  
              RaiseLastWin32Error;  
   
          //   STEP   3:   Initialize   new   SD.  
          pNewSD   :=   AllocMem(cbFileSD);   //   Should   be   same   size   as   FileSD.  
   
          if   (not   InitializeSecurityDescriptor(pNewSD,  
              SECURITY_DESCRIPTOR_REVISION))   then  
              RaiseLastWin32Error;  
   
          //   STEP   4:   Get   DACL   from   SD.  
          if   (not   GetSecurityDescriptorDacl(pFileSD,   fDaclPresent,   p_ACL,  
              fDaclDefaulted))   then  
              RaiseLastWin32Error;  
          //   STEP   5:   Get   size   information   for   DACL.  
          AclInfo.AceCount   :=   0;   //   Assume   NULL   DACL.  
          AclInfo.AclBytesFree   :=   0;  
          AclInfo.AclBytesInUse   :=   SizeOf(ACL);  
   
          if   (fDaclPresent   and   Assigned(p_ACL))   then  
          begin  
              if   (not   GetAclInformation(p_ACL^,   @AclInfo,  
                      SizeOf(ACL_SIZE_INFORMATION),   AclSizeInformation))   then  
                  RaiseLastWin32Error;  
   
              //   STEP   6:   Compute   size   needed   for   the   new   ACL.  
              cbNewACL   :=   AclInfo.AclBytesInUse   +   SizeOf(ACCESS_ALLOWED_ACE)  
                  +   GetLengthSid(pUserSID)   -   SizeOf(DWORD);  
   
              //   STEP   7:   Allocate   memory   for   new   ACL.  
              pNewACL   :=   AllocMem(cbNewACL);  
   
              //   STEP   8:   Initialize   the   new   ACL.  
              if   (not   InitializeAcl(pNewACL^,   cbNewACL,   ACL_REVISION2))   then  
                  RaiseLastWin32Error;  
              //   STEP   9:   If   DACL   is   present,   copy   it   to   a   new   DACL.  
              if   (fDaclPresent)   then  
              begin  
                  //   STEP   10:   Copy   the   file's   ACEs   to   the   new   ACL.  
                  if   (AclInfo.AceCount   >   0)   then  
                  begin  
                      for   CurrentAceIndex   :=   0   to   AclInfo.AceCount   -   1   do  
                      begin  
                          //   STEP   11:   Get   an   ACE.  
                          if   (not   GetAce(p_ACL^,   CurrentAceIndex,   pTempAce))   then  
                              RaiseLastWin32Error;  
                          //   STEP   12:   Add   the   ACE   to   the   new   ACL.  
                          if   (not   AddAce(pNewACL^,   ACL_REVISION,   MAXDWORD,   pTempAce,  
                                PACE_HEADER(pTempAce)^.AceSize))   then  
                              RaiseLastWin32Error;  
                      end  
                  end  
              end;  
   
              //   STEP   13:   Add   the   access-allowed   ACE   to   the   new   DACL.  
              if   (not   AddAccessAllowedAce(pNewACL^,   ACL_REVISION2,   dwAccessMask,  
                      pUserSID))   then  
                  RaiseLastWin32Error;  
   
              //   STEP   14:   Set   the   new   DACL   to   the   file   SD.  
              if   (not   SetSecurityDescriptorDacl(pNewSD,   True,   pNewACL,   False))   then  
                  RaiseLastWin32Error;  
   
              //   STEP   15:   Set   the   SD   to   the   File.  
              if   (not   SetFileSecurity(PChar(FileName),   DACL_SECURITY_INFORMATION,  
                      pNewSD))   then  
                  RaiseLastWin32Error;  
              Result   :=   True;  
          end;  
      finally  
          //   STEP   16:   Free   allocated   memory  
          if   Assigned(pUserSID)   then  
              FreeMem(pUserSID);  
          if   Assigned(szDomain)   then  
              FreeMem(szDomain);  
          if   Assigned(pFileSD)   then  
              FreeMem(pFileSD);  
          if   Assigned(pNewSD)   then  
              FreeMem(pNewSD);  
          if   Assigned(pNewACL)   then  
              FreeMem(pNewACL);  
      end;  
  end;  
 

//添加共享资源的访问权限,对应于对象属性页中"共享"   页中的设置,注意   ShareName  
  //对应的资源应已被设置为共享。这可以通过   NetShareAdd   API   设置  
  function   AddShareAccesRights(const   ShareName:   WideString;  
      const   UserName:   string;   dwAccessMask:   DWORD):   boolean;  
  var  
      //   SID   variables  
      snuType   :   SID_NAME_USE;  
      szDomain   :   PChar;  
      cbDomain:   DWORD;  
      pUserSID:   Pointer;  
      cbUserSID:   DWORD;  
      //   File   SD   variables.  
      pShareSD:   PSECURITY_DESCRIPTOR;  
      //   New   SD   variables.  
      pNewSD:   PSECURITY_DESCRIPTOR;  
      //   ACL   variables.  
      p_ACL   :   PACL;  
      fDaclPresent,   fDaclDefaulted   :   LongBool;  
      AclInfo:   ACL_SIZE_INFORMATION;  
      //Share_Info   variables  
      BufPtr:   PShare_Info_502;  
      ShareInfo:   TShare_Info_502;  
      //   New   ACL   variables.  
      pNewACL   :   PACL;  
      cbNewACL:   DWORD;  
      //   Temporary   ACE.  
      pTempAce:   Pointer;  
      CurrentAceIndex   :   Cardinal;  
      parm_err:   DWORD;  
  begin  
      szDomain   :=   nil;  
      cbDomain   :=   0;  
      pUserSID   :=   nil;  
      cbUserSID   :=   0;  
      pNewSD   :=   nil;  
      p_ACL   :=   nil;  
      pNewACL   :=   nil;  
      pTempAce   :=   nil;  
      BufPtr   :=   nil;  
   
      //   STEP   1:   Get   SID   for   given   user.  
      Result   :=   LookupAccountName(nil,   PChar(UserName),  
          pUserSID,   cbUserSID,   szDomain,   cbDomain,   snuType);  
   
      //   API   should   have   failed   with   insufficient   buffer.  
      if   (not   Result)   and   (GetLastError   <>   ERROR_INSUFFICIENT_BUFFER)   then  
          RaiseLastWin32Error;  
   
      pUserSID   :=   AllocMem(cbUserSID);  
      szDomain   :=   AllocMem(cbDomain);  
      try  
          Result   :=   LookupAccountName(nil,   PChar(UserName),  
                pUserSID,   cbUserSID,   szDomain,   cbDomain,   snuType);  
   
          if   (not   Result)   then  
              RaiseLastWin32Error;  
   
          //   STEP   2:   Get   security   descriptor   (SD)   for   ShareRes.  
          if   (NetShareGetInfo(nil,   PWideChar(ShareName),   502,   Pointer(BufPtr))  
              =   ERROR_SUCCESS)   then  
          begin  
              if   not   IsValidSecurityDescriptor(BufPtr^.shi502_security_descriptor)   then  
                  RaiseLastWin32Error;  
          end  
          else  
              RaiseLastWin32Error;  
   
          pShareSD   :=   BufPtr^.shi502_security_descriptor;  
          //   STEP   3:   Initialize   new   SD.  
          pNewSD   :=   AllocMem(GetSecurityDescriptorLength(pShareSD));  
   
          if   (not   InitializeSecurityDescriptor(pNewSD,  
              SECURITY_DESCRIPTOR_REVISION))   then  
              RaiseLastWin32Error;  
   
          //   STEP   4:   Get   DACL   from   SD.  
          if   (not   GetSecurityDescriptorDacl(pShareSD,   fDaclPresent,   p_ACL,  
              fDaclDefaulted))   then  
              RaiseLastWin32Error;  
          //  
          //   STEP   5:   Get   size   information   for   DACL.  
          //  
          AclInfo.AceCount   :=   0;   //   Assume   NULL   DACL.  
          AclInfo.AclBytesFree   :=   0;  
          AclInfo.AclBytesInUse   :=   SizeOf(ACL);  
   
          if   (fDaclPresent   and   Assigned(p_ACL))   then  
          begin  
              if   (not   GetAclInformation(p_ACL^,   @AclInfo,  
                      SizeOf(ACL_SIZE_INFORMATION),   AclSizeInformation))   then  
                  RaiseLastWin32Error;  
   
              //   STEP   6:   Compute   size   needed   for   the   new   ACL.  
              cbNewACL   :=   AclInfo.AclBytesInUse   +   SizeOf(ACCESS_ALLOWED_ACE)  
                  +   GetLengthSid(pUserSID)   -   SizeOf(DWORD);  
   
              //   STEP   7:   Allocate   memory   for   new   ACL.  
              pNewACL   :=   AllocMem(cbNewACL);  
   
              //   STEP   8:   Initialize   the   new   ACL.  
              if   (not   InitializeAcl(pNewACL^,   cbNewACL,   ACL_REVISION2))   then  
                  RaiseLastWin32Error;  
              //   STEP   9:   If   DACL   is   present,   copy   it   to   a   new   DACL.  
              if   (fDaclPresent)   then  
              begin  
                  //   STEP   10:   Copy   the   file's   ACEs   to   the   new   ACL.  
                  if   (AclInfo.AceCount   >   0)   then  
                  begin  
                      for   CurrentAceIndex   :=   0   to   AclInfo.AceCount   -   1   do  
                      begin  
                          //   STEP   11:   Get   an   ACE.  
                          if   (not   GetAce(p_ACL^,   CurrentAceIndex,   pTempAce))   then  
                              RaiseLastWin32Error;  
                          //   STEP   12:   Add   the   ACE   to   the   new   ACL.  
                          if   (not   AddAce(pNewACL^,   ACL_REVISION,   MAXDWORD,   pTempAce,  
                                PACE_HEADER(pTempAce)^.AceSize))   then  
                              RaiseLastWin32Error;  
                      end  
                  end  
              end;  
   
              //   STEP   13:   Add   the   access-allowed   ACE   to   the   new   DACL.  
              if   (not   AddAccessAllowedAce(pNewACL^,   ACL_REVISION2,   dwAccessMask,  
                      pUserSID))   then  
                  RaiseLastWin32Error;  
   
              //   STEP   14:   Set   the   new   DACL   to   the   new   Share   SD.  
              if   (not   SetSecurityDescriptorDacl(pNewSD,   True,   pNewACL,   False))   then  
                  RaiseLastWin32Error;  
   
              //   STEP   15:   Set   the   new   SD   to   the   ShareRes.  
              Move(BufPtr^,ShareInfo,   SizeOf(ShareInfo));  
              ShareInfo.shi502_security_descriptor   :=   pNewSD;  
              if   not   (NetShareSetInfo(nil,   PWideChar(ShareName),   502,   @ShareInfo,  
                      @parm_err)   =   ERROR_SUCCESS)   then  
                  RaiseLastWin32Error;  
   
              Result   :=   True;  
          end;  
      finally  
          //   STEP   16:   Free   allocated   memory  
          if   Assigned(pUserSID)   then  
              FreeMem(pUserSID);  
          if   Assigned(szDomain)   then  
              FreeMem(szDomain);  
          if   Assigned(pNewSD)   then  
              FreeMem(pNewSD);  
          if   Assigned(pNewACL)   then  
              FreeMem(pNewACL);  
          if   Assigned(BufPtr)   then  
              NetApiBufferFree(BufPtr);  
      end;  
  end;  
 

posted @ 2009-02-03 09:50 delphi2007 阅读(422) | 评论 (0)编辑 收藏

SendMessage到浏览器焦点输入框没有作用? Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiAPI/html/delphi_20061115123755228.html
使用SendMessage(GetFocus,WM_SETTEXT,0,longint(PChar('123456')));  
  当前焦点是浏览器的一个输入框,发现并没有改变输入框的值,而是改变了ie的标题  
  而同样的方法对其它界面都是有效的,该怎么处理?  
 

使WebBrowser获得焦点:  
   
  uses   MSHTML;  
   
  (WebBrowser1.Document   as   IHTMLDocument2).ParentWindow.Focus;

不是WebBrowser是浏览器

取得IE浏览器的窗口句柄,取得IHTMLDocument2接口,然后再利用.ParentWindow.Focus方法使其获得焦点。  
 

老妖:  
  现在是焦点已经在输入框上,只是用SendMessage没法给输入框赋值(我了解到说网页里的输入框是没有hwnd的)  
  你说的ParentWindow.Focus目的是为了把焦点放到输入框上吗?还请明示!  
 

要是能把代码贴出来,不胜感激!

要取得浏览器上的控件是和普通控件不一样的,上面的控件都是通过代码在本地动态生成的,不能简单地调用API,要利用浏览器提供的接口。

posted @ 2009-02-03 09:50 delphi2007 阅读(638) | 评论 (0)编辑 收藏

我在delphi中用shellExecute启动了一个程序(ftp);然后想做一个等待,只到ftp进程结束,再继续下面的操作,请问如何监控这个进程是否已结束? Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiAPI/html/delphi_20061115114909229.html
如题,例如:  
   
      Hinstance:=   ShellExecute(Application.Handle,nil,pchar('ftp'),pchar('-i   -n   -s:'+ScriptName),nil,SW_SHOWNORMAL);  
      for   i:=0   to   10   do  
      begin  
            sleep   1000;  
            if   ftp_end()   then  
                    break;  
      end;

用OpenProcess配合WaitForSingleObject应该可以。

转的  
   
  执行一个外部程序,并等待它完成  
  Function   WinExecExW(cmd,workdir:pchar;visiable:integer):DWORD;  
  var  
    StartupInfo:TStartupInfo;  
    ProcessInfo:TProcessInformation;  
  begin  
    FillChar(StartupInfo,SizeOf(StartupInfo),#0);  
    StartupInfo.cb:=SizeOf(StartupInfo);  
    StartupInfo.dwFlags:=STARTF_USESHOWWINDOW;  
    StartupInfo.wShowWindow:=visiable;  
    if   not   CreateProcess(nil,cmd,nil,nil,false,Create_new_console   or   Normal_priority_class,nil,nil,StartupInfo,ProcessInfo)   then  
        result:=0  
    else  
    begin  
        waitforsingleobject(processinfo.hProcess,INFINITE);  
        GetExitCodeProcess(ProcessInfo.hProcess,Result);  
    end;  
  end;  
 

waitforsingleobject这个函数在xp下好象有问题,会一直等待,我现在不敢用这个;;  
   
  shellExectue   返回了进程的句柄,理论上通过   Hinstance应该是可以查看它的状态的,只是不知道具体怎么做!

那不如自己用TIdFTP  
       
 

posted @ 2009-02-03 09:50 delphi2007 阅读(753) | 评论 (0)编辑 收藏

RAS谁用过 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiAPI/html/delphi_20061115103312230.html
我看windows   sdk中有RasEnumEntries的说明,怎么调用,需要引用那个单元?

拨号连接的枚举哈。想用吗?我可以提供一些帮助

好多年以前做了一个多点远程库房管理,当时还没有什么宽带一说,只有电话拨号,所以就用到了这个玩意

想用啊,要写个代替windows的拨号的程序  
  加我msn:shuyi@dianwan.net

现在上不了msn,或者这里讨论好了

posted @ 2009-02-03 09:50 delphi2007 阅读(165) | 评论 (0)编辑 收藏

消息Hook hook Focus 事件时遇到的问题 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiAPI/html/delphi_20061115102712231.html
我想实现一个功能:  
  安装一个全局消息HOOK,捕获桌面上任意输入框的获得焦点和失去焦点的事件,为了便于测试我先写了一个线程hook做测试,hook自己窗体上的输入框的获得焦点和失去焦点的事件,但是不奏效,请大家帮忙看看哪里有问题  
   
  unit   Unit1;  
   
  interface  
   
  uses  
      Windows,   Messages,   SysUtils,   Classes,   Graphics,   Controls,   Forms,   Dialogs,  
      StdCtrls;  
   
  type  
      TForm1   =   class(TForm)  
        Edit1:   TEdit;  
        Edit2:   TEdit;  
          procedure   FormCreate(Sender:   TObject);  
      private  
          {   Private   declarations   }  
      public  
          {   Public   declarations   }  
      end;  
   
  var  
      Form1:   TForm1;  
   
  implementation  
   
  {$R   *.DFM}  
  var  
      HookHandle:   HHOOK;  
   
  function   TestHookProc(code:   Integer;   wparam:   WPARAM;   lparam:   LPARAM):   LRESULT;stdcall;  
  begin  
          if   code   =   HC_ACTION   then  
          if   PMsg(lparam)^.Message   =   WM_SETFOCUS   then  
          begin  
              ShowMessage('we   get   it');  
          end;  
          Result   :=   CallNextHookEx(HookHandle,   Code,   WParam,   longint(@lparam));  
  end;  
   
  procedure   TForm1.FormCreate(Sender:   TObject);  
  begin  
      HookHandle:=SetWindowsHookEx(Windows.WH_CALLWNDPROC,TestHookProc,0,GetCurrentThreadID);  
  end;  
   
  end.

用WH_SHELL类型的钩子,具体看一下帮助

不对,是WH_CBT

回调函数是这样的  
   
  function   CBTProc(nCode:integer;wParam:wParam;lParam:lParam):LRESULT;stdcall;  
   
  对于nCode的说明:  
  nCode  
   
  Specifies   a   code   that   the   hook   procedure   uses   to   determine   how   to   process   the   message.   This   parameter   can   be   one   of   the   following   values:    
   
  Value Meaning  
  HCBT_ACTIVATE The   system   is   about   to   activate   a   window.  
  HCBT_CLICKSKIPPED The   system   has   removed   a   mouse   message   from   the   system   message   queue.   Upon   receiving   this   hook   code,   a   CBT   application   must   install   a   WH_JOURNALPLAYBACK   hook   procedure   in   response   to   the   mouse   message.  
  HCBT_CREATEWND A   window   is   about   to   be   created.   The   system   calls   the   hook   procedure   before   sending   the   WM_CREATE   or   WM_NCCREATE   message   to   the   window.   If   the   hook   procedure   returns   a   nonzero   value,   the   system   destroys   the   window;   the   CreateWindow   function   returns   NULL,   but   the   WM_DESTROY   message   is   not   sent   to   the   window.   If   the   hook   procedure   returns   zero,   the   window   is   created   normally.  
  At   the   time   of   the   HCBT_CREATEWND   notification,   the   window   has   been   created,   but   its   final   size   and   position   may   not   have   been   determined   and   its   parent   window   may   not   have   been   established.   It   is   possible   to   send   messages   to   the   newly   created   window,   although   it   has   not   yet   received   WM_NCCREATE   or   WM_CREATE   messages.   It   is   also   possible   to   change   the   position   in   the   Z   order   of   the   newly   created   window   by   modifying   the   hwndInsertAfter   member   of   the   CBT_CREATEWND   structure.  
  HCBT_DESTROYWND A   window   is   about   to   be   destroyed.  
  HCBT_KEYSKIPPED The   system   has   removed   a   keyboard   message   from   the   system   message   queue.   Upon   receiving   this   hook   code,   a   CBT   application   must   install   a   WH_JOURNALPLAYBACK_hook   hook   procedure   in   response   to   the   keyboard   message.  
  HCBT_MINMAX A   window   is   about   to   be   minimized   or   maximized.  
  HCBT_MOVESIZE A   window   is   about   to   be   moved   or   sized.  
  HCBT_QS The   system   has   retrieved   a   WM_QUEUESYNC   message   from   the   system   message   queue.  
  HCBT_SETFOCUS A   window   is   about   to   receive   the   keyboard   focus.  
  HCBT_SYSCOMMAND A   system   command   is   about   to   be   carried   out.   This   allows   a   CBT   application   to   prevent   task   switching   by   means   of   hot   keys.  
   
  If   nCode   is   less   than   zero,   the   hook   procedure   must   pass   the   message   to   the   CallNextHookEx   function   without   further   processing   and   should   return   the   value   returned   by   CallNextHookEx.    
   
  如果nCode的值为HCBT_SETFOCUS,则表示检测到了焦点消息。这个时候wParam包含了获得焦点的控件的句柄等信息,lParam包含了失去焦点的控件的句柄等信息。  
   
  以上信息在DELPHI帮助里面都有,请看帮助

posted @ 2009-02-03 09:49 delphi2007 阅读(178) | 评论 (0)编辑 收藏

关于WinExec的问题? Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiAPI/html/delphi_20061114224727232.html
下面为A程序调用B程序,弹出B的登陆界面,自动填入用户名密码来自动登陆B  
   
  procedure   TForm1.Image1Click(Sender:   TObject);  
  var  
      FHwnd   :   THandle;  
      t1Hwnd:THandle;  
      t2Hwnd:   THandle;  
      BHwnd:   THandle;  
  begin  
      WinExec(Pchar('C:\B.exe'),0)   ;  
  //run运行到这里为什么弹出了登陆界面,等待用户响应?  
      为什么不直接运行下面的自动填用户名密码登陆操作??  
  //但是奇怪的是用分步执行,就能执行下去,并自动登陆!!  
      FHwnd:=FindWindow(nil,'系统登录');  
      if   fHwnd>0   then  
      begin  
          t1Hwnd:=FindWindowEx(FHwnd,0,'TComboBox',nil);  
          t2Hwnd:=FindWindowEx(FHwnd,0,'TEdit',nil);  
          BHwnd:=FindWindowEx(FHwnd,0,'TBitBtn',nil);  
   
          if   t1Hwnd>0   then  
              SendMessage(t1Hwnd,   WM_SETTEXT,   0,   Integer(PChar(User)));  
          if   t2Hwnd>0   then  
              SendMessage(t2Hwnd,   WM_SETTEXT,   0,   Integer(PChar(Pwd)));  
          if   BHwnd>0   then  
              SendMessage(BHwnd,   BM_CLICK,   0,   0);  
      end;  
  end;  
   
  情请高手指点!

因为启动进程需要一些时间(哪怕是几十微秒),而代码的执行速度是非常快的,此时可能已经执行完了查找窗口的代码。所以,WinExec(Pchar('C:\B.exe'),0)以后,适当延时一些时间,比如1秒左右,应该就会好一点。延时可以这样:  
  var  
          dwTickCount:   DWORD;  
  begin  
          WinExec('C:\B.exe',   0);  
          //   延时1秒  
          dwTickCount   :=   GetTickCount;  
          while   GetTickCount()   <   dwTickCount   +   1000   do  
                  Application.ProcessMessages;  
          //   继续下一步  
          FHwnd:=FindWindow(nil,'系统登录');  
          ...  
  end;  
 

我顶你个肺

that   sound   great!

Very   Good  
  我调用一般的两层程序,问题是不存在的  
  调用一个三层的程序,就出现上述问题  
  延时1秒后,问题解决  
  Thank   you!   非常感谢老妖的再次指点!  
 

good

posted @ 2009-02-03 09:49 delphi2007 阅读(181) | 评论 (0)编辑 收藏

PostMessage的疑问? Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiAPI/html/delphi_20061114212346233.html
以前已经知道使用消息函数PostMessage或SendMessage就可以给别的程序发消息,觉得很容易。  
   
  像“按键精灵”此类软件,也应该是使用发消息,模拟键盘鼠标信息的。  
   
  最近,也想编一个类似的程序,谁知不试不知道,一使用,才发现问题多多。  
   
  1、网上很多文章都说,使用PostMessage发消息,可以用记事本测试。  
   
  如:  
  PostMessage(handle,   WM_KEYDOWN,   VK_0,   9)  
   
  这句,我给记事本发消息,记事本没反应。(VK_9我已经定义了,就是数字9)  
  我试了计算器,可以用。WORD下也可以用。就记事本不能用。  
   
  PostMessage(handle,   WM_KEYDOWN,   VK_F5,   0)  
   
  这个在记事本下就可以执行了。  
   
  PostMessage(handle,   WM_KEYDOWN,   VK_TAB,   0)  
   
  这句两个软件下都没反应。我加了一句  
   
  PostMessage(handle,   WM_KEYUP,   VK_TAB,   0)  
   
  情况也是一样。  
   
  2、第二点,就是后台执行的问题。  
   
  作一个循环给后台发消息,如WORD。  
   
  如发送1000个‘A’字符。  
   
  只要焦点离开WORD,好像WORD就不响应消息了。再切换回去,才能继续执行。  
   
  但是这两个问题,我使用了一个叫做“按键游侠”的程序,这两个试验都能在以上三个软件中正确正常执行。  
   
  难道还有另一个消息发送函数,或者PostMessage函数还有新的参数可以达到以上效果?  
   
   
   
   
 

键盘消息的相应随应用程序而异,有些响应WM_KEYDOWN,有些响应WM_KEYUP,有些响应WM_CHAR,有些干脆不响应,直接去读键盘的字符缓冲区

学习!

你是怎么取得WORD的handle的   我猜是这个取得方法不对   焦点的转移才带来问题

友情接分;

phalcon(^o^)    
   
  我想handle应该没问题,要不然WORD在第一种情况下也会出问题。

还有SendMessage。  
 

时间太长,算了,结贴。

posted @ 2009-02-03 09:49 delphi2007 阅读(416) | 评论 (0)编辑 收藏

关于汉字生成拼音的的函数 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiAPI/html/delphi_20061114182436234.html
怎么把一个调用一个函数就能把一个汉字生成拼音  
   
  比如输入"青霉素"生成"qms"  
   
  知道的请告诉我一下,谢了!

来自超级猛料的函数:  
   
  function   GetHzPy(const   AHzStr:   string):   string;  
  const  
      ChinaCode:   array[0..25,   0..1]   of   Integer   =   ((1601,   1636),   (1637,   1832),   (1833,   2077),  
          (2078,   2273),   (2274,   2301),   (2302,   2432),   (2433,   2593),   (2594,   2786),   (9999,   0000),  
          (2787,   3105),   (3106,   3211),   (3212,   3471),   (3472,   3634),   (3635,   3722),   (3723,   3729),  
          (3730,   3857),   (3858,   4026),   (4027,   4085),   (4086,   4389),   (4390,   4557),   (9999,   0000),  
          (9999,   0000),   (4558,   4683),   (4684,   4924),   (4925,   5248),   (5249,   5589));  
  var  
      i,   j,   HzOrd:   integer;  
      Hz:   string[2];  
  begin  
      i   :=   1;  
      while   i   <=   Length(AHzStr)   do  
      begin  
          if   (AHzStr[i]   >=   #160)   and   (AHzStr[i   +   1]   >=   #160)   then  
          begin  
              HzOrd   :=   (Ord(AHzStr[i])   -   160)   *   100   +   Ord(AHzStr[i   +   1])   -   160;  
              for   j   :=   0   to   25   do  
              begin  
                  if   (HzOrd   >=   ChinaCode[j][0])   and   (HzOrd   <=   ChinaCode[j][1])   then  
                  begin  
                      Result   :=   Result   +   char(byte('A')   +   j);  
                      break;  
                  end;  
              end;  
              Inc(i);  
          end   else   Result   :=   Result   +   AHzStr[i];  
          Inc(i);  
      end;  
   
      Result   :=   LowerCase(Result);//转为小写  
  end;  
   
  调用方法:  
      Edit1.Text   :=   GetHzPy('青霉素');  
      showmessage(Edit1.Text);  
 

mark

想请问下这个函数能处理多音字的情况吗?是不是还是基于GB2312而已?

多音字这个函数就无能为力了!看来得从新写,将多音字都挑出来单独处理了!  
  如果不是基于GB2312的,内码转换吧!

http://www.dullwolf.cn/  
   
  去下载汉字转换拼音程序,代码公开的,可以转换成任何程序语言,英文操作系统下好使.  
   
  qù     xià     zǎi     hàn     zì     zhuǎn     huàn     pīn     yīn     chéng     xù   ,   dài     mǎ     gōng     kāi     de     ,   kě     yǐ     zhuǎn     huàn     chéng     rèn     hé     chéng     xù     yǔ     yán   ,   yīng     wén    
   
    cāo     zuò     xì     tǒng     xià     hǎo     shǐ   .  
   
  支持大部分多音字  
    zhī     chí     dà     bù     fēn     duō     yīn     zì    
   
  很长     长远         长久  
  hěn     cháng         cháng     yuǎn             cháng     jiǔ    
  生长     成长    
  shēng   zhǎng         chéng     zhǎng  
   
  zhù     fú     suǒ     yǒu     xiōng   di     jiě     mèi     ,     xīn     de     yī     nián     ,     yǒu     gèng     duō     shōu     huò    
   
  祝福所有兄弟姐妹,新的一年,有更多收获  
   
   
  cún     zài     wèn     tí     :   --------   hào     hē     jiǔ     。  
  存在问题:--------好喝酒。  
  fēn     xī     yuán     yīn     :   --------   jiǔ     hǎo     hē     。  
  分析原因:--------酒好喝。  
  zǒng     jié     jīng     yàn     :   --------   hē     jiǔ     hǎo     。  
  总结经验:--------喝酒好。  
  zhěng     gǎi     cuò     shī     :   --------   jiǔ     hē     hǎo     。  
  整改措施:--------酒喝好。  
  nǔ     lì     fāng     xiàng     :   --------   hē     hǎo     jiǔ     。  
  努力方向:--------喝好酒。  
 

posted @ 2009-02-03 09:49 delphi2007 阅读(126) | 评论 (0)编辑 收藏

关于汉字生成拼音的的函数 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiAPI/html/delphi_20061114182415235.html
怎么把一个调用一个函数就能把一个汉字生成拼音  
   
  比如输入"青霉素"生成"qms"  
   
  知道的请告诉我一下,谢了!

来自超级猛料的函数:  
   
  function   GetHzPy(const   AHzStr:   string):   string;  
  const  
      ChinaCode:   array[0..25,   0..1]   of   Integer   =   ((1601,   1636),   (1637,   1832),   (1833,   2077),  
          (2078,   2273),   (2274,   2301),   (2302,   2432),   (2433,   2593),   (2594,   2786),   (9999,   0000),  
          (2787,   3105),   (3106,   3211),   (3212,   3471),   (3472,   3634),   (3635,   3722),   (3723,   3729),  
          (3730,   3857),   (3858,   4026),   (4027,   4085),   (4086,   4389),   (4390,   4557),   (9999,   0000),  
          (9999,   0000),   (4558,   4683),   (4684,   4924),   (4925,   5248),   (5249,   5589));  
  var  
      i,   j,   HzOrd:   integer;  
      Hz:   string[2];  
  begin  
      i   :=   1;  
      while   i   <=   Length(AHzStr)   do  
      begin  
          if   (AHzStr[i]   >=   #160)   and   (AHzStr[i   +   1]   >=   #160)   then  
          begin  
              HzOrd   :=   (Ord(AHzStr[i])   -   160)   *   100   +   Ord(AHzStr[i   +   1])   -   160;  
              for   j   :=   0   to   25   do  
              begin  
                  if   (HzOrd   >=   ChinaCode[j][0])   and   (HzOrd   <=   ChinaCode[j][1])   then  
                  begin  
                      Result   :=   Result   +   char(byte('A')   +   j);  
                      break;  
                  end;  
              end;  
              Inc(i);  
          end   else   Result   :=   Result   +   AHzStr[i];  
          Inc(i);  
      end;  
   
      Result   :=   LowerCase(Result);//转为小写  
  end;  
   
  调用方法:  
      Edit1.Text   :=   GetHzPy('青霉素');  
      showmessage(Edit1.Text);  
 

不错不错!!!

猛啊!

只是拼音首字母吧

我有一个BCB的:  
  http://community.csdn.net/Expert/topic/5157/5157749.xml?temp=.6221277  
  改成delphi不难吧

http://www.dullwolf.cn/  
   
  去下载汉字转换拼音程序,代码公开的,可以转换成任何程序语言,英文操作系统下好使.  
   
  qù     xià     zǎi     hàn     zì     zhuǎn     huàn     pīn     yīn     chéng     xù   ,   dài     mǎ     gōng     kāi     de     ,   kě     yǐ     zhuǎn     huàn     chéng     rèn     hé     chéng     xù     yǔ     yán   ,   yīng     wén    
   
    cāo     zuò     xì     tǒng     xià     hǎo     shǐ   .  
   
  支持大部分多音字  
    zhī     chí     dà     bù     fēn     duō     yīn     zì    
   
  很长     长远         长久  
  hěn     cháng         cháng     yuǎn             cháng     jiǔ    
  生长     成长    
  shēng   zhǎng         chéng     zhǎng  
   
  zhù     fú     suǒ     yǒu     xiōng   di     jiě     mèi     ,     xīn     de     yī     nián     ,     yǒu     gèng     duō     shōu     huò    
   
  祝福所有兄弟姐妹,新的一年,有更多收获  
   
   
  cún     zài     wèn     tí     :   --------   hào     hē     jiǔ     。  
  存在问题:--------好喝酒。  
  fēn     xī     yuán     yīn     :   --------   jiǔ     hǎo     hē     。  
  分析原因:--------酒好喝。  
  zǒng     jié     jīng     yàn     :   --------   hē     jiǔ     hǎo     。  
  总结经验:--------喝酒好。  
  zhěng     gǎi     cuò     shī     :   --------   jiǔ     hē     hǎo     。  
  整改措施:--------酒喝好。  
  nǔ     lì     fāng     xiàng     :   --------   hē     hǎo     jiǔ     。  
  努力方向:--------喝好酒。  
 

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

WM_DROPFILES消息怎么用?一个界面上怎么让多个组件同时支持windows外部文件拖拽。DragAcceptFiles。 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiAPI/html/delphi_20061114152826236.html
unit   Unit1;  
  interface  
  uses  
      Windows,   Messages,   SysUtils,   Variants,   Classes,   Graphics,   Controls,   Forms,  
      Dialogs,   ExtCtrls,   ShellAPI;  
  type  
      TForm1   =   class(TForm)  
          Panel1:   TPanel;  
          procedure   FormCreate(Sender:   TObject);  
      private  
          OLDWndProc:TWndMethod;  
          procedure   DragFileProc(var   Msg:TMessage);message   WM_DROPFILES;  
      public  
          {   Public   declarations   }  
      end;  
  var  
      Form1:   TForm1;  
  implementation  
  {$R   *.dfm}  
  {   TForm1   }  
   
  procedure   TForm1.DragFileProc(var   Msg:   TMessage);  
  var  
      FileName:array   [0..MAX_PATH-1]   of   Char;  
      sFileName:String;  
      Count:integer;  
  begin  
      if   Msg.Msg=WM_DropFiles   then  
      begin  
          Count:=DragQueryFile(Msg.WParam,$FFFFFFFF,@FileName[0],   MAX_PATH);//得到拖放文件的个数  
          if   Count   >   0   then  
          begin  
              FillChar(FileName,   SizeOf(FileName),   #0);  
              DragQueryFile(Msg.WParam,   0,   @FileName[0],   MAX_PATH);//查询文件名称  
              sFileName:=   string(FileName);  
   
          end;  
          DragFinish(Msg.WParam);   //释放所使用的资源  
      end   else  
          OLDWndProc(Msg);  
  end;  
   
  procedure   TForm1.FormCreate(Sender:   TObject);  
  begin  
      DragAcceptFiles(panel1.Handle,   Enabled);  
      OLDWndProc:=   panel1.WindowProc;       //   保存原来的   WindowProc  
      panel1.WindowProc:=   DragFileProc;   //   设置新的   WindowProce  
  end;  
   
  end.  
   
  我想请问下,如果我在一个界面上同时有多个WinControl组件需要支持windows外部文件拖拽,要怎么做?  
   
  通过(var   Msg:TMessage);message   WM_DROPFILES;   能判断出是哪个组件返回的吗?

能不能给TPanel增加接收   WM_DROPFILES   的方法呢。  
  前提是不需要重新编译TPanel控件。编写一个继承类的话就不能放在界面上了。除非编成可视控件。

Uses    
          StdCtrls,ShellApi;  
   
   
  type  
   
      TDragMemo   =   class(TMemo)  
            procedure   DragFileProc(var   Msg:TMessage);message   WM_DROPFILES;  
      end;  
   
      TForm1   =   class(TForm)  
          procedure   FormCreate(Sender:   TObject);  
      private  
          {   Private   declarations   }  
      public  
          {   Public   declarations   }  
      end;  
   
  var  
      Form1:   TForm1;  
   
  implementation  
   
  {$R   *.dfm}  
   
  procedure   TForm1.FormCreate(Sender:   TObject);  
  var  
      Memo:TDragMemo;  
  begin  
      Memo:=   TDragMemo.Create(nil);  
      memo.Parent:=self;  
  end;  
   
  procedure   TDragMemo.DragFileProc(var   Msg:TMessage);  
  begin  
          //your   code  
  end;  
   
  end.  
 

以上只是定义一个类,你可以将它做成一个控件,直接继承WINDOWS控件然后修改DragFileProc就可以了。

woshihaoge(支离破碎)   说的方法我知道啊。  
  但这样的话,如果要直接放在界面上,就要做成控件了。  
   
  我想让   edit,panel,   listview....等一些控件都支持explorer的拖拽,这样写感觉有点....  
   
  还有其他方法吗?

没有办法啊,只能这样子类化,要么做成控件,以前我也研究过类似的问题,貌似书上介绍的就这办法了。

还有人能回答下么

posted @ 2009-02-03 09:49 delphi2007 阅读(674) | 评论 (0)编辑 收藏

如何获取每个进程的I/0的读写字节数???? Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiAPI/html/delphi_20061114150952237.html
1、进程的I/O字节数用什么可得到呢?晕。。。。。  
  2、98下用GETPROCESSTIMES而想得到进程使用率,为何就不行呢?

从WMI获取。想要什么都有,从软到硬。呵呵呵呵/

WMI是个好东东啊!

具体一点。。

Select     ReadTransferCount   from   Win32_Process   Where   Caption   =   '你的进程名'

这个库太慢了,能用NTQUERYSYSTEMINFORMAT!  
  但这个函数怎么获取进程的运行参数呢,谁能告诉哦!  
 

NTQUERYSYSTEMINFORMAT!自己解决了。。。。谢了。。。。

posted @ 2009-02-03 09:49 delphi2007 阅读(130) | 评论 (0)编辑 收藏

控制外部软件的启动及运行,如何将它的闪现窗体也隐藏呢? Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiAPI/html/delphi_20061114145807238.html
需要控制的外部软件的运行情况我了如指掌,所以可以用postmessage的办法全面控制它的运行,也可以用showwindow的show_hide隐藏它的各个弹出窗体,可是总有一些一闪而过的界面,我希望能静悄悄地、屏幕上没有任何反应地将事情办了,能不能做到呢?

需要用到钩子函数SetWindowsHookEx,安装一个钩子,钩子类型为WH_SHELL,可以截获系统弹出的前端窗口,在这个消息送到消息队列前你可以对它进行处理,也可以截获消息后屏蔽。有关内容可以查阅一下相关资料。

posted @ 2009-02-03 09:49 delphi2007 阅读(126) | 评论 (0)编辑 收藏

windows.setparent可以将一个窗口显示到别的位置上,可是如果我只是想将这个窗口上的内容复制一份并显示在别的位置,该如何做呢? Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiAPI/html/delphi_20061114145117239.html
万分感谢回答的朋友!
posted @ 2009-02-03 09:49 delphi2007 阅读(427) | 评论 (0)编辑 收藏

经试验createprocess+sw_hide不能隐藏那些经过修改的绿色软件,有没有办法可以将绿软也隐藏呢? Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiAPI/html/delphi_20061114144853240.html
试验了多个软件,都不能隐藏,只好在运行过后再用showwindow(h,sw_hide)再隐藏一次,可是用这种办法隐藏的绿色软件在任务栏上还会有一个窗口,如何才能全面隐藏那些绿色软件的运行界面呢?希望有过类似经验的仁兄指点一二,万分感谢。
posted @ 2009-02-03 09:49 delphi2007 阅读(216) | 评论 (0)编辑 收藏

如何把一个bin文件捆绑到一个可执行文件exe中? Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiAPI/html/delphi_20061114120737241.html
如何把一个bin文件捆绑到一个可执行文件exe中?而且可以读bin文件里的内容进行处理?请教各位大侠了,谢谢!

利用资源文件就可以

对,用resource将其以二进制形式导入。也可以用其它方法动态构造出bin,但比较麻烦。

用资源的话,好象还是要把资源文件写到磁盘上访问的啊,不过如果能把资源文件释放到内存中来访问也不错的。就不知道哪位会!      
 

资源文件可以用流访问阿  
  (1)存取资源文件中的位图  
  //RC:   testBmp   bitmap   res\test.bmp  
  Image1.Picture.Bitmap.LoadFromResourceName(HInstance,   ’res\test.bmp’);  
  或:  
  //RC:   testBmp   bmptype   res\test.bmp  
  var  
      resStream:   TResourceStream;  
  begin  
      resStream   :=   TResourceStream.Create(HInstance,   ’testBmp’,   ’bmptype’);  
      Image1.Picture.Bitmap.LoadFromStream(resStream);  
      resStream.Free;  
  end;  
   
  请注意上面两种调用方式的不同之处。  
   
  (2)存取资源文件中的图标  
   
  将图标放在资源文件中,可以实现动态改变应用程序的图标。  
  //RC:   testIcon   icon   res\test.ico  
  Application.Icon.Handle   :=   LoadIcon(HInstance,   ’testIcon’);  
   
  (3)存取资源文件中的AVI动画  
   
  //RC:   testAvi   avi   res\test.avi  
  Animate1.ResName   :=   ’testAvi’;  
  Animate1.Active   :=   True;  
   
  (4)存取资源文件中的JPEG图像  
   
  为了能够处理JPEG图像,必须在Interface处引用JPEG单元。  
   
  var  
      jpg:   TJPEGImage;  
   
      resStream:   TResourceStream;  
  begin  
      jpg   :=   TJPEGImage.Create;  
      resStream   :=   TResourceStream.Create(HInstance,   ’testJpg’,   ’jpgtype’);  
      jpg.LoadFromStream(resStream);  
      Image1.Picture.Assign(jpg);  
      jpg.Free;  
      resStream.Free;  
  end;  
   
  补充:  
    1.资源类型除上述类型外,还可以字体文件,字符串文件等。  
   
    2.资源文件不但可以在标准图形界面下使用还可在控制台下使用。  
 

http://community.csdn.net/Expert/topic/5149/5149565.xml?temp=.1734583

先LoadLibrary(...);  
  再用   FindResource();

posted @ 2009-02-03 09:49 delphi2007 阅读(200) | 评论 (0)编辑 收藏

MID DlL窗体与Application.Messagebox 结合后控件失效??? Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiAPI/html/delphi_20061114101124242.html
现在若干窗体,封装成DLL窗体(MDI子窗体).  
  现发现一个大问题:  
    如果MDI子窗体上有表格控件,如DBGrid或DBGridEh,而且在提交数据时或者发生了其它各种错误,并且出现了MessageBox信息框(不管是系统自己弹出的还是人工用Try...Except...显示的MessageBox),都会有问题,表现在:  
  1、表格就会没有用了。也就是用鼠标去点时没反应(就像发生了   adoDataset.DisabledControls一样,但我断点检测发现并没有执行   adoDataset.DisabledControls操作,而且,点DBNavigator时,表格上的记录还能移动,用方向键或Mouse点表格却无反应)。  
  2、DBGrid或DBGridEh本身的Enabled是正常的,可用的;  
  3、出现上面的错误时,如果把焦点移到表格以外(如各种Edit,或Button),再到表格上点一下鼠标,问题马上就解决了。  
   
      附注:  
      如果我人工用   Showmessage显示出错时的信息而不用   Application.MessageBox,就不会出错;  
     
    请问各位,我应该如何办呀?我必须要用   Application.MessageBox(也就是有左上角有图标的那种消息框),因为Showmessage有时会处于窗体的下面,使用户点不到,而且,有时我还要用Application.MessageBox与用户对话。  
   
 

用API:   MessageBox

而且,我发现,如果不封成DLL窗体,再怎么搞都不会出错/  
  上楼的哥们,我的Application.Messagebox算不算API呀?  
  另外,我的对话框有时会用于   非窗体(也就是说,有时单纯的DLL里要用,单纯的Unit也要用.我是把消息框写成一个自定义函数,我担心会不会是   Handle   引起的)

Application.Messagebox这是VCL中的方法。  
  我建议你用API:MessageBox试试:  
   
  MessageBox(0,   '信息',   '标题',   MB_OK   or   MB_ICONINFORMATION);  
  类似这样。

大哥,我刚才试了一下,暂时是解决问题了,但请大哥再详细回答一下:  
  1.   VCL的与API的有什么本质不同?   为什么我用Application的会有那种错误发生?  
  2.   MessageBox(0     中的   0   作句柄是什么意思呢? 我要求绝对不能出现   消息框 显示在活动窗体后面的情况(因为我经常看到有的程序出这样的错误,使用户难以再操作下去)  
  3.我在网上查到资料,有的网友写:  
      MessageBox   (   GetActiveWindow(),   ...)    
  意思是获取活动社会分配的句柄,他们的方法用于非窗体时会不会产生找不到   ActiveWindow而出错的情况?  
  谢谢!

我的问题和你的类似,关注,就是有时调用application.messagebox()时,程序会失去活动状态,不知道什么原因???关注

这个问题,我也碰到过,那时我对话框是写成公用函数的,后来出现对话框跑到窗体后面,于是对话函数体就增加了一个handle的参数

posted @ 2009-02-03 09:49 delphi2007 阅读(150) | 评论 (0)编辑 收藏

多个资源文件释放的问题 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiAPI/html/delphi_20061113192259243.html
已经做好了一个资源文件,里面包含有若干二进制文件,我有TResourceStream来实现资源的释放,问题就在这里,我现在用的格式是  
              if   FileExists('C:\a.exe')   then  
              begin  
                  rs:=TResourceStream.Create(HInstance,'a.exe','exefile');  
                  rs.SaveToFile('C:\a.exe');  
                  rs.Free;  
              end;  
              if   FileExists('C:\b.exe')   then  
              begin  
                  rs:=TResourceStream.Create(HInstance,'b.exe','exefile');  
                  rs.SaveToFile('C:\b.exe');  
                  rs.Free;  
              end;  
              if   FileExists('C:\c.exe')   then  
              begin  
                  rs:=TResourceStream.Create(HInstance,'c.exe','exefile');  
                  rs.SaveToFile('C:\c.exe');  
                  rs.Free;  
              end;  
  总感觉不是很好,每次都要构造新的对象,能不能在原来对象的基础上继续读资源的方法?  
 

上面的判断语句统一加上not,刚才忘记写了

把公用的部分写成一个函数  
   
  procedure   ExportResToFile(const   ResName,   ResType,   FileName:   string);    
  var    
    Res:   TResourceStream;    
  begin    
    if   not   FileExists(FileName)   then  
    begin  
        Res:=   TResourceStream.Create(HInstance,   ResName,   PChar(ResType));    
        try    
            Res.SaveToFile(FileName);   //将资源保存为文件,即还原文件    
        finally    
            Res.Free;    
        end;    
      end;  
  end;

posted @ 2009-02-03 09:49 delphi2007 阅读(163) | 评论 (0)编辑 收藏

多线程访问数据库的问题 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiAPI/html/delphi_20061113111452244.html
有个程序   运行大概五天左右的时间    
  就报Access   violation   at   address   00D24081   in   module   'borlndmm.dll'.   Write   of   address   033F00E8  
  数据库查询是用dll写的  
  访问数据库时是用的同一个连接  
  也就是说会出现多个线程同时依靠这个连接进行查询数据   不知道是不是这个原因导致以上错误    
  有没有什么解决的办法

旧题新帖?   dll   入口定义要帖出来,   入口函数体也要(执行部分就没什么用)  
   
  还有那段引起   access   violation   的代码是哪句  
   
  数据库连接可以由   dll   里面去建立的,   在   dll   间送对像总之有点不好把握

function   TOpDataBase.OpenSql(const   SqlStr:   string):   Boolean;  
  begin  
        Result   :=   QueryDB_Ado(FDBHandle,   PChar(SqlStr),   FAdoQuery,   FErrStr);  
        if   not   Result   then  
          SetConnected(False);      
  end;  
  调用以上函数时报错   access   violation    
   
  dll定义:  
   
  Function   QueryDB_Ado(         P_Handle       :Integer;  
                                                    P_SQLStr       :PChar;  
                                            Var   P_AdoQuery1:TAdoQuery;  
                                                    P_ErrScript:PChar):Boolean;   stdcall;   external   'DBAccessDll.dll';  
  至于dll内部代码是什么   不清楚    
  不明白的是为什么运行5,6天后才报错呢

主要矛盾在这两个参数  
   
  var   P_AdoQuery1   :TAdoQuery;   //   这个倒不是问题,   不标准  
  P_ErrScript:PChar                       //   这个嗯,怎么说  
   
  FErrStr   你的定义是什么?   Pchar?  
  如果是   Pchar   那你有没分配内存?应该分配多少内存?dll   作得不好哈,   那你只要分配个几K让他够了  
   
  估计这个   dll   调用次数很少,   要不然,   100   次以内应该就会出错  
 

FErrStr   是一个查询数据库报错时返回的信息啊    
  它的定义是  
          FErrStr:   array[0..255]   of   Char;  
  一个数组   不用分配内存吧      
 

如果查询正确的话   这个FErrStr     是用不到的   仅仅是用来存放错误信息

那我就不知了,   帮顶吧

posted @ 2009-02-03 09:49 delphi2007 阅读(210) | 评论 (0)编辑 收藏

困惑:如何调用另一个程序,并控制它 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiAPI/html/delphi_20061113000418245.html
我现在想调用B(也是delphi)程序,我用的是  
  procedure   TForm1.Button1Click(Sender:   TObject);  
  begin  
      ShellExecute(0,'open',projectB.exe'),nil,nil,SW_ShowNormal);  
  end;  
  启动后出现B程序的登陆界面,界面上有登陆框  
     
  问题是:如何向里面传进用户名和密码  
  并能实现自动点击登陆按钮的操作?

有好多方法实现。我给你一个我的实例(看门狗WatchDog)  
  var  
      Dir:   string;  
  begin  
      ...  
      Dir   :=   ExtractFileDir(Application.ExeName);  
      Winexec(Pchar(Dir+'\SMSEVALUATE.EXE   00001   11111),1);  
      //SMSEVALUATE.EXE是我的程序名称与WatchDog在同一目录下  
        用户代码:00001   用户密码:11111(你不一定这样设置,只要区分有没有参数就可以了)  
      ...  
   
   
  在SMSEVALUATE的Project中这样写:  
   
      Application.Initialize;  
      Application.Title   :=   '我的系统;  
      with     TFormLogin.Create(Application)   do  
      begin  
          if   ParamCount   =   0   then   //重要点,  
                                                          //如果没有参数就正常显示登陆窗口,  
                                                          //如果有参数就不显示,  
                                                          //在FormLogin中要加入带参数运行时的处理代码  
              ShowModal;  
          if   ModalResult   =   1   then  
          ...

楼主碰到的情况可能是B程序用不了参数的吧,要给他的文本框里发信息

//  
  楼主碰到的情况可能是B程序用不了参数的吧,要给他的文本框里发信息  
  //  
  任何程序都可以带参数运行,就看你程序内部如何处理参数啦。所以不用给他的文本框里发信息  
   
  //  
  给他的文本框里发信息  
  //  
  太僵硬的思路啦  
 

呵呵,谢谢两位:)  
  补充一下:B程序里的代码改动不了  
  只能往B的文本框里传信息  
   
  这种情况怎么处理?  
 

先启动B这个进程,然后用FindWindow/FindWindowEx/GetWindow等API查找目标程序主窗口上的文本框和按钮(这个过程可能要试好几次才能准确找到),成功得到文本框句柄后,用SetWindowText或WM_SETTEXT给文本框赋值,再向按钮发送BM_CLICK消息,例如:  
  SendMessage(hButton,   BM_CLICK,   0,   0);

对对,这种实现方法很适合我的情况  
  就是能不能给点   代码demo之类的,如上面的sanmaotuo(老冯)兄弟那样  
  感激ing...

那都是些API应用,还需要详细代码?  
   
  这样吧,你去www.ccrun.com/spy4win下载spy4win,可以自动产生一些简单的查找窗口的代码)for   C++,Delphi,VB),看看你就明白了。

经指点后,我写了以下一段代码  
  但是还有一个问题:如下,  
   
  procedure   TForm1.Button3Click(Sender:   TObject);  
  var  
      FHwnd   :   THandle;  
      t1Hwnd:THandle;  
      t2Hwnd:   THandle;  
      BHwnd:   THandle;  
   
  begin  
      WinExec(PChar('project1.exe'),SW_HIDE)   ;  
      FHwnd:=FindWindow(nil,'form1');  
      if   fHwnd>0   then  
      begin  
          t1Hwnd:=FindWindowEx(fHwnd,0,nil,'edit1');  
          t2Hwnd:=FindWindowEx(fHwnd,0,nil,'edit2');  
  //这样成功取到edit1句柄的前提是edit1的text必须有值  
      但是当edit1的text属性为空的时候就取不到句柄,这可咋整??  
   
          BHwnd:=FindWindowEx(fHwnd,0,nil,'button1');  
   
          if   t1Hwnd>0   then   PostMessage(t1Hwnd,WM_IME_CHAR,ord('a'),0)   ;  
          if   t2Hwnd>0   then   PostMessage(t2Hwnd,WM_IME_CHAR,ord('b'),0)   ;  
          if   BHwnd>0   then   PostMessage(BHwnd,WM_KEYDOWN,VK_RETURN   ,0)   ;  
      end;  
      //PostMessage(FHwnd,WM_KEYDOWN,VK_RETURN   ,0)  
      //SendMessage(FHwnd,   BM_CLICK,   0,   0);  
  end;  
      还望指点!

查找Edit时,先用FindWindowEx找到第一个文本框,第四个参数可为空,直接查找类名就可以。成功后用GetWnidow再查找下一个兄弟窗口。  
  可以参考一下这个:  
   
  自动填写序列号演示  
  AutoFillSnDemo,安装Office2003时自动填写序列号工具源码,ccrun(老妖)编写。读者可自己扩展一下,成为一个通用的序列号填写工具。  
  http://www.ccrun.com/view.asp?id=349

在主模块调用子模块时(主模块与子模块是独立的程序),用DLL或DDE即可!  
 

ccrun(老妖)已经说得很清楚了,   我来把老妖的精神Coding一下。很认真做的哦,不是说笑哈。  
  type  
      TSAppForm   =   class(TForm)  
          Button:   TButton;  
          procedure   ButtonClick(Sender:   TObject);  
      private  
          function   FindControlByNumber(hApp:   HWND;   ControlClassName:   string;   ControlNumber:   Integer):   HWND;  
          procedure   SetEditText(hApp:   HWND;   EditClassName,   AText:   string;   EditNumber:   Integer);  
          procedure   SetButtonActive(hApp:   HWND;   ButtonClassName:   string;   ButtonNumber:   Integer);  
      public  
          {   Public   declarations   }  
      end;  
   
  var  
      SAppForm:   TSAppForm;  
   
  implementation  
   
  {$R   *.dfm}  
   
  {   TSAppForm   }  
   
  function   TSAppForm.FindControlByNumber(hApp:   HWND;  
      ControlClassName:   string;   ControlNumber:   Integer):   HWND;  
  var  
      i:   Word;  
      hControl:   HWND;  
  begin  
      Result   :=   0;  
      hControl   :=   0;  
      if   IsWindow(hApp)   then  
      begin  
          hControl   :=   0;  
          for   i   :=   0   to   Pred(ControlNumber)   do  
          begin  
              hControl   :=   FindWindowEx(hApp,   hControl,   PChar(ControlClassName),   nil);  
              if   hControl   =   0   then  
                  Exit;  
          end;  
      end;  
      Result   :=   hControl;  
  end;  
   
  procedure   TSAppForm.SetEditText(hApp:   HWND;   EditClassName,   AText:   string;  
      EditNumber:   Integer);  
  var  
      hEdit:   HWND;  
  begin  
      hEdit   :=   FindControlByNumber(hApp,   EditClassName,   EditNumber);  
      if   hEdit   <>   0   then  
          SendMessage(hEdit,   WM_SETTEXT,   0,   Integer(PChar(AText)));  
  end;  
   
  procedure   TSAppForm.ButtonClick(Sender:   TObject);  
  var  
      hApp:   HWND;  
  begin  
      hApp   :=   FindWindow(nil,   'RAppForm');  
      if   hApp   >   0   then  
      begin  
          SetEditText(hApp,   'TEdit',   'Cock',   1);  
          SetEditText(hApp,   'TEdit',   'Pussy',   2);  
          SetButtonActive(hApp,   'TButton',   1);  
      end;  
  end;  
   
  procedure   TSAppForm.SetButtonActive(hApp:   HWND;   ButtonClassName:   string;  
      ButtonNumber:   Integer);  
  var  
      hButton:   HWND;  
  begin  
      hButton   :=   FindControlByNumber(hApp,   ButtonClassName,   ButtonNumber);  
      if   hButton   >   0   then  
          SendMessage(hButton,   WM_KEYDOWN,   VK_RETURN,   0);  
  end;  
   
  end.  
   
   
  -------------------------------  
   
   
  type  
      TRAppForm   =   class(TForm)  
          Button:   TButton;  
          Edit1:   TEdit;  
          Edit2:   TEdit;  
          procedure   ButtonKeyDown(Sender:   TObject;   var   Key:   Word;  
              Shift:   TShiftState);  
      private  
          {   Private   declarations   }  
      public  
          {   Public   declarations   }  
      end;  
   
  var  
      RAppForm:   TRAppForm;  
   
  implementation  
   
  {$R   *.dfm}  
   
  procedure   TRAppForm.ButtonKeyDown(Sender:   TObject;   var   Key:   Word;  
      Shift:   TShiftState);  
  begin  
      if   Key   =   VK_Return   then  
          ShowMessage(Edit1.Text+'\'+Edit2.Text);  
  end;

经过你两多次指点,问题解决  
  非常感谢,好人啊!  
 

献上我的拙码给其他需要的人:  
  (B程序上为   两个edit和一个button)  
  procedure   TForm1.Button1Click(Sender:   TObject);  
  var  
      FHwnd   :   THandle;  
      t1Hwnd:THandle;  
      t2Hwnd:   THandle;  
      BHwnd:   THandle;  
   
  begin  
      WinExec(PChar('projectB.exe'),SW_HIDE)   ;  
      FHwnd:=FindWindow(nil,'form1');  
      if   fHwnd>0   then  
      begin  
          t1Hwnd:=FindWindowEx(FHwnd,0,'TEdit',nil);  
          if   t1Hwnd<>0   then  
              t2Hwnd:=GetWindow(t1Hwnd,   GW_HWNDNEXT);  
          BHwnd:=FindWindowEx(FHwnd,0,'TButton',nil);  
   
          if   t1Hwnd>0   then    
                SendMessage(t1Hwnd,   WM_SETTEXT,   0,   Integer(PChar('user')));  
          if   t2Hwnd>0   then    
                SendMessage(t2Hwnd,   WM_SETTEXT,   0,   Integer(PChar('pwd')));  
          if   BHwnd>0   then  
              PostMessage(BHwnd,WM_KEYDOWN,VK_RETURN   ,0)   ;  
      end;  
  end;  
 

posted @ 2009-02-03 09:49 delphi2007 阅读(267) | 评论 (0)编辑 收藏

如何模拟鼠标的拖拽行为. Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiAPI/html/delphi_20061112235944246.html
我想用鼠标模拟拖拽某一表格的列行为,就是把第一列拖到第五列寻样.

计算好目标窗口的坐标,然后把该窗口置为前台,再用类似下面这样的代码试试:  
  mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);  
  mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);

楼上的方法偶试过,但一直没有成功.  
  测试情况是wm_lbuttondown,   wm_mousemove,wm_lbuttonup消息都捕获了  
  (坐标是没有问题的.)  
  就是没有实现拖动列的效果.  
  偶是在DELPHI下试的.  
   
 

function   MouseToScreen(mVertical:   Boolean;   mMouse:   Integer):   Integer;  
  begin  
      case   mVertical   of  
          False:   Result   :=   Round(mMouse   *   (MAXWORD   /   Screen.Width));  
      else   Result   :=   Round(mMouse   *   (MAXWORD   /   Screen.Height));  
      end;  
  end;  
   
  procedure   TForm1.Button1Click(Sender:   TObject);  
  var  
      vPoint:   TPoint;  
  begin  
      vPoint   :=   Panel1.ClientToScreen(Point(1,   1));  
      mouse_event(MOUSEEVENTF_ABSOLUTE   or   MOUSEEVENTF_MOVE,  
          MouseToScreen(False,   vPoint.X),   MouseToScreen(True,   vPoint.Y),   0,   0);  
      mouse_event(MOUSEEVENTF_ABSOLUTE   or   MOUSEEVENTF_LEFTDOWN,  
          MouseToScreen(False,   vPoint.X),   MouseToScreen(True,   vPoint.Y),   0,   0);  
      Dec(vPoint.X,   200);  
      Dec(vPoint.Y,   200);  
      mouse_event(MOUSEEVENTF_ABSOLUTE   or   MOUSEEVENTF_MOVE,  
          MouseToScreen(False,   vPoint.X),   MouseToScreen(True,   vPoint.Y),   0,   0);  
      mouse_event(MOUSEEVENTF_ABSOLUTE   or   MOUSEEVENTF_LEFTUP,  
          MouseToScreen(False,   vPoint.X),   MouseToScreen(True,   vPoint.Y),   0,   0);  
  end;  
   
  procedure   TForm1.FormCreate(Sender:   TObject);  
  begin  
      Panel1.DragKind   :=   dkDock;  
      Panel1.DragMode   :=   dmAutomatic;  
  end;  
 

TO   楼上:  
  非常感谢!  
  可是对TStringGrid列的拖动还是不行.

posted @ 2009-02-03 09:49 delphi2007 阅读(375) | 评论 (0)编辑 收藏

delphi写的一个dll,在接口中如何接受外部程序送给他的一个数据集! Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiAPI/html/delphi_20061112220726247.html
delphi写的一个dll,在接口中如何接受外部程序送给他的一个数据集!  
   
  比如,我在VB中写了一个数据集   adodb.recordset     想传送给dll中,dll中的接口类型定义成TADOQuery   这样可以吗?试过 有问题,请问,这样的以数据集为参数的要如何处理!

这个不可以的,  
  VB中的数据集   adodb.recordset,和delphi中的TADOQuery   是两种不同类,不能传递数据集的;  
   
  另想方法吧;  
   
 

使用XML来传,这个大家都是支持的.

VB中的数据集   adodb.recordset,和delphi中的TADOQuery   是两种不同类,不能传递数据集的;  
  但如果都是用Delphi开发的程序和Dll,可不可以传递呢?

如果是delphi之间,exe与dll也就是,函数(过程)与函数(过程)之间之间传递一个TADOQuery是可以的.

posted @ 2009-02-03 09:49 delphi2007 阅读(332) | 评论 (0)编辑 收藏

请教自定义程序运行的权限的问题 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiAPI/html/delphi_20061112215003248.html
老板让我做一个程序,要求程序自动在系统启动时运行,而且不管当前登录的用户是否有管理员权限,程序都是以administrators的权限运行(目的是为了完全对注册表和系统目录、文件有读写权限),不知道是否做得到?如果做得到应该怎么做呢?  
  ps:程序安装或设置时必须有管理员权限也没关系。

那Windows的权限管理不是形同虚设?

做成系统服务,是以SYSTEM身份运行  
  比administrators   权限还高  
  呵呵   :)

posted @ 2009-02-03 09:49 delphi2007 阅读(127) | 评论 (0)编辑 收藏

没有窗体怎么使用定时器呢? Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiAPI/html/delphi_20061112185601249.html
做那中简单的程序的时候(不是控制台程序),想要使用API函数SetTimer来设置定时器,请问应该怎么写代码呢,关键是那个HWND应该是什么呢,我没有窗体怎么设置

简单的方法,就是用一个隐藏的窗体,好像没有窗体是不能成为一个程序的,除非你做的是服务程序,你如果做过c写windows程序就会对这一点有比较深的认识了。

毕竟时钟也是一个事件,必须用消息队列,有消息队列,一般就必须制定什么窗体接受这个消息队列。  
  看了你的要求,我想很多人碰到过你的想法,包括本人,但是你有这种想法,如果不是服务程序,只能说明你的程序体系没有构思好,构思好了,就不会有你这种想法,或者说很容易找到解决方法。

到MSDN看SetTimer的帮助

晕,   楼上的等于没说嘛  
  怎么可能没窗体呢?这是   delphi,至少也要个主窗体才能运行的.  
   
  不过可以考虑自写一线程作   timer   的嘛,   简单得很  
   
  procedure   xxx.Execute;  
  begin  
      while   not   Terminated   do  
      begin  
          if   FTimerEvent   :=   TEVent.WaitFor(FInterval)   =   wrTimeout   then  
                Synchronize(DoTimer);   你爱挂哪挂哪  
      end;  
  end;

Delphi才不是必须要窗体呢,从Project菜单中选择Remove   From   Project   就可以删掉自动生成的窗体,代码可以在工程文件的benin     end.之间添加,这样的话就没有窗体了,明明用不到前台界面的话,再添加一个隐藏的窗体进去,总是感觉有点多余  
   
  我要研究下楼上的代码先

也可以使用多媒体定时器:  
   
  timeSetEvent

program   Project1;  
   
  uses  
      Windows,Dialogs;  
   
  procedure   TimerProc(hWindow:HWND;   uMsg:UINT;   idEvent:UINT;   dwTime:DWORD);stdcall;  
  begin  
      Showmessage('a');  
  end;  
   
  var   Msg:   TMsg;  
   
  begin  
      SetTimer(HWND(nil),1,3000,@TimerProc);  
      while   GetMessage(Msg,   0,   0,   0)   do   TranslateMessage(Msg);  
      KillTimer(HWND(nil),1);  
  end.  
   
   
  我是这样写的  
  可是为什么没有显示对话框?

这样哈,   这样倒是没想过,   不过也行,   Application.Handle   是任务栏上的那个   hwnd   不知道能不能用作   timer   用

窗口句柄是一定要的,   timer   要求进入消息队列

楼上说的好,“消息队列”,就是这个,没有窗口,谁检索这个呢?

仔细看看我1、2   楼的分析,不要想当然

楼主要求   BT   哈,   Application.Handle   试过不行的话就可以考虑用线程了吧,   要不然的确是作不了

问题终于解决了,楼上不对,由于没有使用Forms单元,何来Application?  
  我认为,窗口句柄不见得那么必需,我解决的时候是在大循环中加入DispatchMessage函数,这样才能将WM_TIMER消息送到预先定义的回掉函数?虽然仍有不解,但是代码工作的很好,CPU使用率也没有什么异常

分数什么的怎么处理?不知道啊

//   DELPHI写程序可以没有窗体.  
  //   新建一个Application,然后关闭   Unit1,不要保存。再ALT   +   P,   V,修改为以下代码  
   
  program   Project1;  
   
  uses  
  //     Forms;  
      Windows;  
   
  {$R   *.RES}  
   
  var  
      i:   integer;  
  begin  
      for   i   :=   0   to   100   do  
      begin  
          Sleep(1000);  
      end;  
  //     Application.Initialize;  
  //     Application.Run;  
  end.  
 

//测试通过  
   
  program   Project1;  
   
  uses  
      Windows,Dialogs;  
   
  procedure   TimerProc(hWindow:HWND;   uMsg:UINT;   idEvent:UINT;   dwTime:DWORD);stdcall;  
  begin  
      Showmessage('a');  
  end;  
   
  var   Msg:   TMsg;  
   
  begin  
      SetTimer(HWND(nil),1,3000,@TimerProc);  
      while   GetMessage(Msg,   0,   0,   0)   do  
      begin  
          TranslateMessage(Msg);  
          DispatchMessage(Msg);   //〈〈〈add  
      end;  
      KillTimer(HWND(nil),1);  
  end.

我的这个行吗?  
   
  procdure   Tmythread.execute;  
  var  
    t1,t2:Dword;  
  begin  
    t1:=gettickcount;  
    t2:=gettickcount;  
    while   ((t2-t1)<10000)   do  
    begin  
      ...  
      t2:=gettickcount;  
      sleep(500);  
    end;  
  end;

HandleAllcoate

AllocateHWnd   用这个

posted @ 2009-02-03 09:49 delphi2007 阅读(295) | 评论 (0)编辑 收藏

ActiveForm 中显示模式窗口,当切换为其它应用程序,再切回来后应用程序不能获得焦点,模式窗口到应用程序的后面了,怎么办 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiAPI/html/delphi_20061112180622250.html
ActiveForm   中显示模式窗口,当切换为其它应用程序,再切回来后应用程序不能获得焦点,模式窗口到应用程序的后面了,怎么办

猜测,没有试验,不知道是不是指定了窗体的父窗体,或者owner窗体,是不是可以解决你的问题。

我也遇到这样的问题,一直没办法解决。  
  楼上的方法试过,有问题,指定了那个模式窗口的父窗体之后,这个子窗体不能获得焦点了

好像显示窗体的时候硬性规定显示在最上面;  
  用ShowModal;

可以控制鼠标来点一下这个窗口。

注意你模式窗口的parent属性,如下设置:  
  ActiveForm的某个事件中  
  showForm   :=   TShowForm.Create(self);  
  showForm.parent   :=   self;  
  showForm.ShowModel;  
   
  同理,MessageBox()也是这个道理,如果把handle设为self.Handle,就不会出现这种情况。  
 

楼上的你有没有试过,这根本不行,一执行ShowModal包括OCx的主窗体就不响应焦点   了

posted @ 2009-02-03 09:49 delphi2007 阅读(428) | 评论 (0)编辑 收藏

仅列出标题
共34页: First 12 13 14 15 16 17 18 19 20 Last