当前位置:首页
开发技术指南» 文章正文
    引言:

    摘要: 在delphi中如何获取所有已运行程序的名称和该程序的窗口标题,有谁知道,非常感谢! ......
 ·有请斑竹等高手进来探讨    »显示摘要«
    摘要: 在我的form中我建了一个强类型的dataset(ds),并且在其中创建了两个表分别为purchasemaster,purchasedetail并且为两个表建立了关联,名为purchasemasterpurchasedetail,关系的更新、删除规则都设为cascade,接受/拒绝规则设为默认。 在我的form中有几个textbox(已经和purchasemaster的对应字段做了帮定)和......


哪位大侠能帮忙一下将这段 VC 代码翻译成 Delphi 代码, 不胜感谢

这是一段获取硬盘物理序列号的代码,   非常有用。可惜是   VC   写的,小弟不懂   VC   ,哪位帮忙改写成   Delphi   代码,双手奉上   100   分。如果翻译之后请发送到   ilyf22@sohu.com   ,   非常感谢!  
   
  因为代码太长,无法贴出,请从以下地址下载:ftp://60.191.135.11/soft/wdsoft/lyf/diskid32.cpp

NO.1   作者: xixuemao

function   GetIdeSerialNumber()   :   PChar;  
  const  
      IDENTIFY_BUFFER_SIZE   =   512;  
  type  
      TIDERegs   =   packed   record  
            bFeaturesReg:   BYTE;   //   Used   for   specifying   SMART   "commands".  
            bSectorCountReg:   BYTE;   //   IDE   sector   count   register  
            bSectorNumberReg:   BYTE;   //   IDE   sector   number   register  
            bCylLowReg:   BYTE;   //   IDE   low   order   cylinder   value  
            bCylHighReg:   BYTE;   //   IDE   high   order   cylinder   value  
            bDriveHeadReg:   BYTE;   //   IDE   drive/head   register  
            bCommandReg:   BYTE;   //   Actual   IDE   command.  
            bReserved:   BYTE;   //   reserved   for   future   use.   Must   be   zero.  
      end;  
   
      TSendCmdInParams   =   packed   record  
          //   Buffer   size   in   bytes  
          cBufferSize:   DWORD;  
          //   Structure   with   drive   register   values.  
          irDriveRegs:   TIDERegs;  
          //   Physical   drive   number   to   send   command   to   (0,1,2,3).  
          bDriveNumber:   BYTE;  
          bReserved:   array[0..2]   of   Byte;  
          dwReserved:   array[0..3]   of   DWORD;  
          bBuffer:   array[0..0]   of   Byte;   //   Input   buffer.  
      end;  
   
      TIdSector   =   packed   record  
          wGenConfig:   Word;  
          wNumCyls:   Word;  
          wReserved:   Word;  
          wNumHeads:   Word;  
          wBytesPerTrack:   Word;  
          wBytesPerSector:   Word;  
          wSectorsPerTrack:   Word;  
          wVendorUnique:   array[0..2]   of   Word;  
          sSerialNumber:   array[0..19]   of   CHAR;  
          wBufferType:   Word;  
          wBufferSize:   Word;  
          wECCSize:   Word;  
          sFirmwareRev:   array[0..7]   of   Char;  
          sModelNumber:   array[0..39]   of   Char;  
          wMoreVendorUnique:   Word;  
          wDoubleWordIO:   Word;  
          wCapabilities:   Word;  
          wReserved1:   Word;  
          wPIOTiming:   Word;  
          wDMATiming:   Word;  
          wBS:   Word;  
          wNumCurrentCyls:   Word;  
          wNumCurrentHeads:   Word;  
          wNumCurrentSectorsPerTrack:   Word;  
          ulCurrentSectorCapacity:   DWORD;  
          wMultSectorStuff:   Word;  
          ulTotalAddressableSectors:   DWORD;  
          wSingleWordDMA:   Word;  
          wMultiWordDMA:   Word;  
          bReserved:   array[0..127]   of   BYTE;  
      end;  
   
      PIdSector   =   ^TIdSector;  
   
      TDriverStatus   =   packed   record  
          //   驱动器返回的错误代码,无错则返回0  
          bDriverError:   Byte;  
          //   IDE出错寄存器的内容,只有当bDriverError   为   SMART_IDE_ERROR   时有效  
          bIDEStatus:   Byte;  
          bReserved:   array[0..1]   of   Byte;  
          dwReserved:   array[0..1]   of   DWORD;  
      end;  
   
      TSendCmdOutParams   =   packed   record  
          //   bBuffer的大小  
          cBufferSize:   DWORD;  
          //   驱动器状态  
          DriverStatus:   TDriverStatus;  
          //   用于保存从驱动器读出的数据的缓冲区,实际长度由cBufferSize决定  
          bBuffer:   array[0..0]   of   BYTE;  
      end;  
  var  
      hDevice   :   THandle;  
      cbBytesReturned   :   DWORD;  
      SCIP   :   TSendCmdInParams;  
      aIdOutCmd   :   array[0..(SizeOf(TSendCmdOutParams)   +   IDENTIFY_BUFFER_SIZE   -   1)   -   1]   of   Byte;  
      IdOutCmd   :   TSendCmdOutParams   absolute   aIdOutCmd;  
   
      procedure   ChangeByteOrder(var   Data;   Size:   Integer);  
      var  
          ptr   :   PChar;  
          i   :   Integer;  
          c   :   Char;  
      begin  
          ptr   :=   @Data;  
   
          for   I   :=   0   to   (Size   shr   1)   -   1   do  
          begin  
              c   :=   ptr^;  
              ptr^   :=   (ptr   +   1)^;  
              (ptr   +   1)^   :=   c;  
              Inc(ptr,   2);  
          end;  
      end;  
  begin  
      Result   :=   ;   //   如果出错则返回空串  
   
      if   SysUtils.Win32Platform   =   VER_PLATFORM_WIN32_NT   then     //   Windows   NT,   Windows   2000  
      begin  
          //   提示!   改变名称可适用于其它驱动器,如第二个驱动器:   \\.\PhysicalDrive1\  
          hDevice   :=   CreateFile(\\.\PhysicalDrive0,   GENERIC_READ   or   GENERIC_WRITE,  
                                                      FILE_SHARE_READ   or   FILE_SHARE_WRITE,   nil,   OPEN_EXISTING,   0,   0);  
      end  
      else   //   Version   Windows   95   OSR2,   Windows   98  
          hDevice   :=   CreateFile(\\.\SMARTVSD,   0,   0,   nil,   CREATE_NEW,   0,   0);  
   
          if   hDevice   =   INVALID_HANDLE_VALUE   then   Exit;  
   
          try  
              FillChar(SCIP,   SizeOf(TSendCmdInParams)   -   1,   #0);  
              FillChar(aIdOutCmd,   SizeOf(aIdOutCmd),   #0);  
              cbBytesReturned   :=   0;  
   
              //   Set   up   data   structures   for   IDENTIFY   command.  
              with   SCIP   do  
              begin  
                  cBufferSize   :=   IDENTIFY_BUFFER_SIZE;  
   
                  //   bDriveNumber   :=   0;  
                  with   irDriveRegs   do  
                  begin  
                      bSectorCountReg   :=   1;  
                      bSectorNumberReg   :=   1;  
   
                      //   if   Win32Platform=VER_PLATFORM_WIN32_NT   then   bDriveHeadReg   :=   $A0  
                      //   else   bDriveHeadReg   :=   $A0   or   ((bDriveNum   and   1)   shl   4);  
                      bDriveHeadReg   :=   $A0;  
                      bCommandReg   :=   $EC;  
                  end;  
              end;  
   
              if   not   DeviceIoControl(hDevice,   $0007C088,   @SCIP,   SizeOf(TSendCmdInParams)   -   1,  
                                                          @aIdOutCmd,   SizeOf(aIdOutCmd),   cbBytesReturned,   nil)   then   Exit;  
          finally  
              CloseHandle(hDevice);  
          end;  
   
          with   PIdSector(@IdOutCmd.bBuffer)^   do  
          begin  
              ChangeByteOrder(sSerialNumber,   SizeOf(sSerialNumber));  
              (Pchar(@sSerialNumber)   +   SizeOf(sSerialNumber))^   :=   #0;  
   
              Result   :=   Pchar(@sSerialNumber);  
   
              end;  
  end;  
   
   
  procedure   TForm1.Button1Click(Sender:   TObject);  
  begin  
      showmessage(GetIdeSerialNumber);  
  end;

NO.2   作者: windy2000

var  
    i:integer;  
    lpVolumeNameBuffer:string;  
    nVolumeNameSize:dword;  
    lpVolumeSerialNumber:lpdword;  
    lpMaximumComponentLength:dword;  
    lpFileSystemFlags:dword;  
    lpFileSystemNameBuffer:string;  
    nFileSystemNameSize   :dword;  
   
  begin  
   
      setlength(lpvolumenamebuffer,100);  
      new(lpvolumeserialnumber);  
      setlength(lpfilesystemnamebuffer,20);  
      nvolumenamesize:=100;  
      nFileSystemNameSize:=20;  
      if   not   GetVolumeInformation(   pchar(leftstr(systemdir,3)),   //系统目录所在的磁盘根路径   ,如c:\  
                                                  pchar(lpVolumeNameBuffer),nVolumeNameSize,   //卷名  
                                                  lpVolumeSerialNumber,   //磁盘卷序列号  
                                                  lpMaximumComponentLength,   //文件名长度  
                                                  lpFileSystemFlags,   //二进制位标志的变量  
                                                  pchar(lpFileSystemNameBuffer),nFileSystemNameSize)   then  
      BEGIN  
          Application.MessageBox(PCHAR(请检查系统配置!),PCHAR(错误),MB_OK+MB_ICONERROR);  
          application.terminate;  
      END;  
      snstr:=trim(inttostr(lpvolumeserialnumber^));   //序列号  
 

NO.3   作者: ttily77

2003下也没有错,通过

NO.4   作者: koren

MSDN中有DeviceIoControl的详细说明


 ·这个sql语句为什么不行    »显示摘要«
    摘要: select top 20 seq_no from (select top 909 * from (select *, 1 as type from guanli.dbo.tm_object_data where (order_no is null and order_deno is null) and section_no = 8110 order by seq_no desc......
» 本期热门文章:

©2000-2007 All Rights Reserved. 最佳浏览:1024X768 MSIE