全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:99019
推到 Plurk!
推到 Facebook!
[<<] [1] [2] [>>]

心得分享系列(BCB)

 
bruce0211
版主


發表:157
回覆:668
積分:279
註冊:2002-06-13

發送簡訊給我
#32 引用回覆 回覆 發表時間:2003-01-11 17:07:29 IP:210.208.xxx.xxx 未訂閱
心得分享 : 如何將自己的 AP 自動被 Focused     ■前言 最近在寫 POS 第二片螢幕做媒體播放時,媒體播放由於是呼叫另一個獨立執行檔(因為不想跟 POS 主程式混在一起寫),發覺焦點會跑到媒體播放程式上,本想說用以前的知識,先記住主程式的 Handle , 再用下列方法中的幾個方法 ShowWindow(Handle) BringWindowToTop(Handle) SetForegroundWindow(Handle) SetActiveWindow(Handle) Application->BringToFront() 就可將焦點自動帶回主程式 沒想到主程式是會被帶到 Top 沒錯 但似乎不能自動被 Focused (按鍵主控權仍然在媒體播放程式上) 且執行上述 API 後 底下工作列,我主程式的小圖示會一閃一閃 表 API 有作用 , 但 就是一定要人用 MOUSE 去點一下 才會被 Focused (鍵盤輸入才會回到主程式) 但我的 POS 程式是無滑鼠系統, 鍵盤也是 POS 專屬鍵盤(沒有 ALT+Tab 可以切換程式焦點) POS 程式上遺失焦點是件很嚴重的事 後來問人終於得到答案,在此分享:  在主程式中設個 Timer ,隨時檢查焦點並將焦點設回到主程式中    
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, 0, SPIF_SENDCHANGE);
SetForegroundWindow(Application->MainForm->Handle);
}
<< BCB 源碼任務 http://home.kimo.com.tw/bruce0829/ >>
bruce0211
版主


發表:157
回覆:668
積分:279
註冊:2002-06-13

發送簡訊給我
#33 引用回覆 回覆 發表時間:2005-08-08 17:50:51 IP:211.21.xxx.xxx 未訂閱
【文章】取得檔案 MD5 值副函式  【作者】源碼任務 bruce0211@yahoo.com.tw 2005/08/08 【內文】心得分享系列    ■前言    目前因工作專案, 急須一個取得檔案 MD5 值的副函式 , 由於環境限制無法外掛 DLL ,  結果找遍所有資料 , 不是不支援 BCB , 就是號稱支援 BCB 的 DELPHI 元件或單元 ,  有語法上的問題(不知該元件作者到底有無在 BCB 上測過 ??) , 根本無法轉給 BCB 用 INDY 內有個單元叫 IdHashMessageDigest.pas , 有支援取得檔案 MD5 值的函式 , 但不是每個 INDY 版本都有附這個單元 , 且在 BCB 上仍有問題 , 所以火大 , 參照 INDY 原始碼 , 直接寫成 BCB 副函式 , 以後就不用再靠那些裝不起來的元件或是 內部黑箱作業的 DLL     ■ BCB 版副函式 (MyHashMD5.cpp)    
//===========================================================================
//MyHashMD5.h
//===========================================================================
#ifndef MyHashMD5H
#define MyHashMD5H    typedef DWORD T4x4LongWordRecord[4];
typedef Byte T512BitRecord[64];
typedef DWORD T16x4LongWordRecord[16];    String __fastcall HashValue(TStream* AStream);
void   __fastcall MDCoder();
DWORD  __fastcall ROL(DWORD AVal, Byte AShift);    #endif    //===========================================================================
//MyHashMD5.cpp
//===========================================================================
#include 
#pragma hdrstop    #include "MyHashMD5.h"
#include "stdio.h"
#include "System.hpp"    //---------------------------------------------------------------------------    #pragma package(smart_init)    //T4x4LongWordRecord  MD5_INIT_VALUES={0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476};
//T4x4LongWordRecord  FState;
//T512BitRecord FCBuffer;    DWORD MD5_INIT_VALUES[]={0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476};
DWORD FState[4];
Byte  FCBuffer[64];    DWORD MD5_SINE[]=
   {
   0,  //墊底用 , 所以 MD5_SINE 的 size 是 65 , 真正有效的範圍是 MD5_SINE[1]-MD5_SINE[65]
   // Round 1.
   0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, 0xf57c0faf, 0x4787c62a,
   0xa8304613, 0xfd469501, 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be,
   0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821,
   // Round 2.
   0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, 0xd62f105d, 0x02441453,
   0xd8a1e681, 0xe7d3fbc8, 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed,
   0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a,
   // Round 3.
   0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, 0xa4beea44, 0x4bdecfa9,
   0xf6bb4b60, 0xbebfbc70, 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05,
   0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665,
   // Round 4.
   0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, 0x655b59c3, 0x8f0ccc92,
   0xffeff47d, 0x85845dd1, 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1,
   0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391
  };    //---------------------------------------------------------------------------
String __fastcall HashValue(TStream* AStream)
{
  long LStartPos;
  __int64 LBitSize, LSize;      LStartPos = AStream->Position;
  LSize = AStream->Size - LStartPos;      // A straight assignment would be by ref on dotNET.
  for(int i=0; i<=3 ; i  ) FState[i] = MD5_INIT_VALUES[i];
        while (LSize - AStream->Position >= 64)
  {
    AStream->Read(FCBuffer, 64);
    MDCoder();
  }      // Read the last set of bytes.
  LStartPos = AStream->Read(FCBuffer, 64);
  // Append one bit with value 1
  FCBuffer[LStartPos] = 0x80;
  LStartPos = LStartPos   1;      // Must have sufficient space to insert the 64-bit size value
  if (LStartPos > 56)
  {
    for (int i=LStartPos; i<=63; i  ) FCBuffer[i] = 0;
    MDCoder();
    LStartPos = 0;
  }      // Pad with zeroes. Leave room for the 64 bit size value.
  for (int i=LStartPos; i<=55; i  ) FCBuffer[i] = 0;      // Append the Number of bits processed.
  LBitSize = LSize * 8;
  for (int i=56; i<=63; i  )
  {
    FCBuffer[i] = (LBitSize & 0xFF);
    LBitSize = (LBitSize >> 8);
  }      MDCoder();
  
  Byte S[16];
  String S1;
  Move(FState, &S[0], 16);
  for (int i=0; i<=15; i  )
  {
    S1=S1 IntToHex(Byte(S[i]),2);
  }      return(S1);    }
//---------------------------------------------------------------------------
void __fastcall MDCoder()
{
  DWORD A, B, C, D;
  //T16x4LongWordRecord x; // 64-byte buffer
  DWORD x[16];      A = FState[0];
  B = FState[1];
  C = FState[2];
  D = FState[3];      for (int i=0; i<=15 ; i  )
  {
    x[i] = FCBuffer[i*4 0]  
            (FCBuffer[i*4 1] << 8)  
            (FCBuffer[i*4 2] << 16)  
            (FCBuffer[i*4 3] << 24);
  }      // Round 1
  A = ROL(A   (((D ^ C) & B) ^ D)   x[ 0]   MD5_SINE[ 1],  7)   B;
  D = ROL(D   (((C ^ B) & A) ^ C)   x[ 1]   MD5_SINE[ 2], 12)   A;
  C = ROL(C   (((B ^ A) & D) ^ B)   x[ 2]   MD5_SINE[ 3], 17)   D;
  B = ROL(B   (((A ^ D) & C) ^ A)   x[ 3]   MD5_SINE[ 4], 22)   C;
  A = ROL(A   (((D ^ C) & B) ^ D)   x[ 4]   MD5_SINE[ 5],  7)   B;
  D = ROL(D   (((C ^ B) & A) ^ C)   x[ 5]   MD5_SINE[ 6], 12)   A;
  C = ROL(C   (((B ^ A) & D) ^ B)   x[ 6]   MD5_SINE[ 7], 17)   D;
  B = ROL(B   (((A ^ D) & C) ^ A)   x[ 7]   MD5_SINE[ 8], 22)   C;
  A = ROL(A   (((D ^ C) & B) ^ D)   x[ 8]   MD5_SINE[ 9],  7)   B;
  D = ROL(D   (((C ^ B) & A) ^ C)   x[ 9]   MD5_SINE[10], 12)   A;
  C = ROL(C   (((B ^ A) & D) ^ B)   x[10]   MD5_SINE[11], 17)   D;
  B = ROL(B   (((A ^ D) & C) ^ A)   x[11]   MD5_SINE[12], 22)   C;
  A = ROL(A   (((D ^ C) & B) ^ D)   x[12]   MD5_SINE[13],  7)   B;
  D = ROL(D   (((C ^ B) & A) ^ C)   x[13]   MD5_SINE[14], 12)   A;
  C = ROL(C   (((B ^ A) & D) ^ B)   x[14]   MD5_SINE[15], 17)   D;
  B = ROL(B   (((A ^ D) & C) ^ A)   x[15]   MD5_SINE[16], 22)   C;      // Round 2
  A = ROL(A   (C ^ (D & (B ^ C)))   x[ 1]   MD5_SINE[17],  5)   B;
  D = ROL(D   (B ^ (C & (A ^ B)))   x[ 6]   MD5_SINE[18],  9)   A;
  C = ROL(C   (A ^ (B & (D ^ A)))   x[11]   MD5_SINE[19], 14)   D;
  B = ROL(B   (D ^ (A & (C ^ D)))   x[ 0]   MD5_SINE[20], 20)   C;
  A = ROL(A   (C ^ (D & (B ^ C)))   x[ 5]   MD5_SINE[21],  5)   B;
  D = ROL(D   (B ^ (C & (A ^ B)))   x[10]   MD5_SINE[22],  9)   A;
  C = ROL(C   (A ^ (B & (D ^ A)))   x[15]   MD5_SINE[23], 14)   D;
  B = ROL(B   (D ^ (A & (C ^ D)))   x[ 4]   MD5_SINE[24], 20)   C;
  A = ROL(A   (C ^ (D & (B ^ C)))   x[ 9]   MD5_SINE[25],  5)   B;
  D = ROL(D   (B ^ (C & (A ^ B)))   x[14]   MD5_SINE[26],  9)   A;
  C = ROL(C   (A ^ (B & (D ^ A)))   x[ 3]   MD5_SINE[27], 14)   D;
  B = ROL(B   (D ^ (A & (C ^ D)))   x[ 8]   MD5_SINE[28], 20)   C;
  A = ROL(A   (C ^ (D & (B ^ C)))   x[13]   MD5_SINE[29],  5)   B;
  D = ROL(D   (B ^ (C & (A ^ B)))   x[ 2]   MD5_SINE[30],  9)   A;
  C = ROL(C   (A ^ (B & (D ^ A)))   x[ 7]   MD5_SINE[31], 14)   D;
  B = ROL(B   (D ^ (A & (C ^ D)))   x[12]   MD5_SINE[32], 20)   C;      // Round 3.
  A = ROL(A   (B ^ C ^ D)   x[ 5]   MD5_SINE[33],  4)   B;
  D = ROL(D   (A ^ B ^ C)   x[ 8]   MD5_SINE[34], 11)   A;
  C = ROL(C   (D ^ A ^ B)   x[11]   MD5_SINE[35], 16)   D;
  B = ROL(B   (C ^ D ^ A)   x[14]   MD5_SINE[36], 23)   C;
  A = ROL(A   (B ^ C ^ D)   x[ 1]   MD5_SINE[37],  4)   B;
  D = ROL(D   (A ^ B ^ C)   x[ 4]   MD5_SINE[38], 11)   A;
  C = ROL(C   (D ^ A ^ B)   x[ 7]   MD5_SINE[39], 16)   D;
  B = ROL(B   (C ^ D ^ A)   x[10]   MD5_SINE[40], 23)   C;
  A = ROL(A   (B ^ C ^ D)   x[13]   MD5_SINE[41],  4)   B;
  D = ROL(D   (A ^ B ^ C)   x[ 0]   MD5_SINE[42], 11)   A;
  C = ROL(C   (D ^ A ^ B)   x[ 3]   MD5_SINE[43], 16)   D;
  B = ROL(B   (C ^ D ^ A)   x[ 6]   MD5_SINE[44], 23)   C;
  A = ROL(A   (B ^ C ^ D)   x[ 9]   MD5_SINE[45],  4)   B;
  D = ROL(D   (A ^ B ^ C)   x[12]   MD5_SINE[46], 11)   A;
  C = ROL(C   (D ^ A ^ B)   x[15]   MD5_SINE[47], 16)   D;
  B = ROL(B   (C ^ D ^ A)   x[ 2]   MD5_SINE[48], 23)   C;      // Round 4.
  A = ROL(A   ((B | ~ D) ^ C)   x[ 0]   MD5_SINE[49],  6)   B;
  D = ROL(D   ((A | ~ C) ^ B)   x[ 7]   MD5_SINE[50], 10)   A;
  C = ROL(C   ((D | ~ B) ^ A)   x[14]   MD5_SINE[51], 15)   D;
  B = ROL(B   ((C | ~ A) ^ D)   x[ 5]   MD5_SINE[52], 21)   C;
  A = ROL(A   ((B | ~ D) ^ C)   x[12]   MD5_SINE[53],  6)   B;
  D = ROL(D   ((A | ~ C) ^ B)   x[ 3]   MD5_SINE[54], 10)   A;
  C = ROL(C   ((D | ~ B) ^ A)   x[10]   MD5_SINE[55], 15)   D;
  B = ROL(B   ((C | ~ A) ^ D)   x[ 1]   MD5_SINE[56], 21)   C;
  A = ROL(A   ((B | ~ D) ^ C)   x[ 8]   MD5_SINE[57],  6)   B;
  D = ROL(D   ((A | ~ C) ^ B)   x[15]   MD5_SINE[58], 10)   A;
  C = ROL(C   ((D | ~ B) ^ A)   x[ 6]   MD5_SINE[59], 15)   D;
  B = ROL(B   ((C | ~ A) ^ D)   x[13]   MD5_SINE[60], 21)   C;
  A = ROL(A   ((B | ~ D) ^ C)   x[ 4]   MD5_SINE[61],  6)   B;
  D = ROL(D   ((A | ~ C) ^ B)   x[11]   MD5_SINE[62], 10)   A;
  C = ROL(C   ((D | ~ B) ^ A)   x[ 2]   MD5_SINE[63], 15)   D;
  B = ROL(B   ((C | ~ A) ^ D)   x[ 9]   MD5_SINE[64], 21)   C;      FState[0]=FState[0] A;
  FState[1]=FState[1] B;
  FState[2]=FState[2] C;
  FState[3]=FState[3] D;    }
//---------------------------------------------------------------------------
DWORD __fastcall ROL(DWORD AVal, Byte AShift)
{
   DWORD r=((AVal << AShift) | (AVal >> (32 - AShift)));
   return(r);
}    
■ Delphi 版副函式 (MyHashMD5.pas)
//===========================================================================
//MyHashMD5.pas
//===========================================================================    unit MyHashMD5;    interface    uses
  Classes, SysUtils, Dialogs, Forms;    type
T16x4LongWordRecord = array[0..15] of LongWord;
T4x4LongWordRecord = array [0..3] of LongWord;
T512BitRecord = array [0..63] of byte;
TIdBytes = array of LongWord;    const
  MD5_INIT_VALUES: T4x4LongWordRecord = (
    $67452301, $EFCDAB89, $98BADCFE, $10325476);      MD5_SINE : array [1..64] of LongWord = (
   { Round 1. }
   $d76aa478, $e8c7b756, $242070db, $c1bdceee, $f57c0faf, $4787c62a,
   $a8304613, $fd469501, $698098d8, $8b44f7af, $ffff5bb1, $895cd7be,
   $6b901122, $fd987193, $a679438e, $49b40821,
   { Round 2. }
   $f61e2562, $c040b340, $265e5a51, $e9b6c7aa, $d62f105d, $02441453,
   $d8a1e681, $e7d3fbc8, $21e1cde6, $c33707d6, $f4d50d87, $455a14ed,
   $a9e3e905, $fcefa3f8, $676f02d9, $8d2a4c8a,
   { Round 3. }
   $fffa3942, $8771f681, $6d9d6122, $fde5380c, $a4beea44, $4bdecfa9,
   $f6bb4b60, $bebfbc70, $289b7ec6, $eaa127fa, $d4ef3085, $04881d05,
   $d9d4d039, $e6db99e5, $1fa27cf8, $c4ac5665,
   { Round 4. }
   $f4292244, $432aff97, $ab9423a7, $fc93a039, $655b59c3, $8f0ccc92,
   $ffeff47d, $85845dd1, $6fa87e4f, $fe2ce6e0, $a3014314, $4e0811a1,
   $f7537e82, $bd3af235, $2ad7d2bb, $eb86d391
  );
//---------------------------------------------------------------------------
function  HashValue(AStream: TStream): AnsiString; overload;
procedure MDCoder;
function  ROL(AVal: LongWord; AShift: Byte): LongWord;
//---------------------------------------------------------------------------
implementation    var
    FState: T4x4LongWordRecord;
    FCBuffer: T512BitRecord;        //FState: array [0..3] of LongWord;
    //FCBuffer: array [0..63] of byte;    //---------------------------------------------------------------------------
function HashValue(AStream: TStream): AnsiString;  overload;
var
  LStartPos: Integer;
  LBitSize,
  LSize: Int64;
  I: Integer;
  r: String;
  S,S1: String;
begin
  LStartPos := AStream.Position;
  LSize := AStream.Size - LStartPos;      // A straight assignment would be by ref on dotNET.
  for I := 0 to 3 do
    FState[I] := MD5_INIT_VALUES[I];      while LSize - AStream.Position >= 64 do
  begin
    AStream.Read(FCBuffer, 64);
    MDCoder;
  end;      // Read the last set of bytes.
  LStartPos := AStream.Read(FCBuffer, 64);
  // Append one bit with value 1
  FCBuffer[LStartPos] := $80;
  LStartPos := LStartPos   1;      // Must have sufficient space to insert the 64-bit size value
  if LStartPos > 56 then
  begin
    for I := LStartPos to 63 do
      FCBuffer[I] := 0;
    MDCoder;
    LStartPos := 0;
  end;      // Pad with zeroes. Leave room for the 64 bit size value.
  for I := LStartPos to 55 do
    FCBuffer[I] := 0;      // Append the Number of bits processed.
  LBitSize := LSize * 8;
  for I := 56 to 63 do
  begin
    FCBuffer[I] := LBitSize and $FF;
    LBitSize := LBitSize shr 8;
  end;      MDCoder;           SetLength(S, 16);
  Move(FState, S[1], 16);
  for i := 1 to Length(S) do begin
  S1 := S1   Format('x', [Byte(S[i])]);
  end;
  while Pos(' ', S1) > 0 do S1[Pos(' ', S1)] := '0';      Result:=S1;
  
end;
//---------------------------------------------------------------------------
procedure MDCoder;
var
  A, B, C, D : LongWord;
  i: Integer;
  x : T16x4LongWordRecord; // 64-byte buffer
begin
  A := FState[0];
  B := FState[1];
  C := FState[2];
  D := FState[3];      for i := 0 to 15 do
  begin
    x[i] := FCBuffer[i*4 0]  
            (FCBuffer[i*4 1] shl 8)  
            (FCBuffer[i*4 2] shl 16)  
            (FCBuffer[i*4 3] shl 24);
  end;      { Round 1 }
  A := ROL(A   (((D xor C) and B) xor D)   x[ 0]   MD5_SINE[ 1],  7)   B;
  D := ROL(D   (((C xor B) and A) xor C)   x[ 1]   MD5_SINE[ 2], 12)   A;
  C := ROL(C   (((B xor A) and D) xor B)   x[ 2]   MD5_SINE[ 3], 17)   D;
  B := ROL(B   (((A xor D) and C) xor A)   x[ 3]   MD5_SINE[ 4], 22)   C;
  A := ROL(A   (((D xor C) and B) xor D)   x[ 4]   MD5_SINE[ 5],  7)   B;
  D := ROL(D   (((C xor B) and A) xor C)   x[ 5]   MD5_SINE[ 6], 12)   A;
  C := ROL(C   (((B xor A) and D) xor B)   x[ 6]   MD5_SINE[ 7], 17)   D;
  B := ROL(B   (((A xor D) and C) xor A)   x[ 7]   MD5_SINE[ 8], 22)   C;
  A := ROL(A   (((D xor C) and B) xor D)   x[ 8]   MD5_SINE[ 9],  7)   B;
  D := ROL(D   (((C xor B) and A) xor C)   x[ 9]   MD5_SINE[10], 12)   A;
  C := ROL(C   (((B xor A) and D) xor B)   x[10]   MD5_SINE[11], 17)   D;
  B := ROL(B   (((A xor D) and C) xor A)   x[11]   MD5_SINE[12], 22)   C;
  A := ROL(A   (((D xor C) and B) xor D)   x[12]   MD5_SINE[13],  7)   B;
  D := ROL(D   (((C xor B) and A) xor C)   x[13]   MD5_SINE[14], 12)   A;
  C := ROL(C   (((B xor A) and D) xor B)   x[14]   MD5_SINE[15], 17)   D;
  B := ROL(B   (((A xor D) and C) xor A)   x[15]   MD5_SINE[16], 22)   C;      { Round 2 }
  A := ROL(A   (C xor (D and (B xor C)))   x[ 1]   MD5_SINE[17],  5)   B;
  D := ROL(D   (B xor (C and (A xor B)))   x[ 6]   MD5_SINE[18],  9)   A;
  C := ROL(C   (A xor (B and (D xor A)))   x[11]   MD5_SINE[19], 14)   D;
  B := ROL(B   (D xor (A and (C xor D)))   x[ 0]   MD5_SINE[20], 20)   C;
  A := ROL(A   (C xor (D and (B xor C)))   x[ 5]   MD5_SINE[21],  5)   B;
  D := ROL(D   (B xor (C and (A xor B)))   x[10]   MD5_SINE[22],  9)   A;
  C := ROL(C   (A xor (B and (D xor A)))   x[15]   MD5_SINE[23], 14)   D;
  B := ROL(B   (D xor (A and (C xor D)))   x[ 4]   MD5_SINE[24], 20)   C;
  A := ROL(A   (C xor (D and (B xor C)))   x[ 9]   MD5_SINE[25],  5)   B;
  D := ROL(D   (B xor (C and (A xor B)))   x[14]   MD5_SINE[26],  9)   A;
  C := ROL(C   (A xor (B and (D xor A)))   x[ 3]   MD5_SINE[27], 14)   D;
  B := ROL(B   (D xor (A and (C xor D)))   x[ 8]   MD5_SINE[28], 20)   C;
  A := ROL(A   (C xor (D and (B xor C)))   x[13]   MD5_SINE[29],  5)   B;
  D := ROL(D   (B xor (C and (A xor B)))   x[ 2]   MD5_SINE[30],  9)   A;
  C := ROL(C   (A xor (B and (D xor A)))   x[ 7]   MD5_SINE[31], 14)   D;
  B := ROL(B   (D xor (A and (C xor D)))   x[12]   MD5_SINE[32], 20)   C;      { Round 3 }
  A := ROL(A   (B xor C xor D)   x[ 5]   MD5_SINE[33],  4)   B;
  D := ROL(D   (A xor B xor C)   x[ 8]   MD5_SINE[34], 11)   A;
  C := ROL(C   (D xor A xor B)   x[11]   MD5_SINE[35], 16)   D;
  B := ROL(B   (C xor D xor A)   x[14]   MD5_SINE[36], 23)   C;
  A := ROL(A   (B xor C xor D)   x[ 1]   MD5_SINE[37],  4)   B;
  D := ROL(D   (A xor B xor C)   x[ 4]   MD5_SINE[38], 11)   A;
  C := ROL(C   (D xor A xor B)   x[ 7]   MD5_SINE[39], 16)   D;
  B := ROL(B   (C xor D xor A)   x[10]   MD5_SINE[40], 23)   C;
  A := ROL(A   (B xor C xor D)   x[13]   MD5_SINE[41],  4)   B;
  D := ROL(D   (A xor B xor C)   x[ 0]   MD5_SINE[42], 11)   A;
  C := ROL(C   (D xor A xor B)   x[ 3]   MD5_SINE[43], 16)   D;
  B := ROL(B   (C xor D xor A)   x[ 6]   MD5_SINE[44], 23)   C;
  A := ROL(A   (B xor C xor D)   x[ 9]   MD5_SINE[45],  4)   B;
  D := ROL(D   (A xor B xor C)   x[12]   MD5_SINE[46], 11)   A;
  C := ROL(C   (D xor A xor B)   x[15]   MD5_SINE[47], 16)   D;
  B := ROL(B   (C xor D xor A)   x[ 2]   MD5_SINE[48], 23)   C;      { Round 4 }
  A := ROL(A   ((B or not D) xor C)   x[ 0]   MD5_SINE[49],  6)   B;
  D := ROL(D   ((A or not C) xor B)   x[ 7]   MD5_SINE[50], 10)   A;
  C := ROL(C   ((D or not B) xor A)   x[14]   MD5_SINE[51], 15)   D;
  B := ROL(B   ((C or not A) xor D)   x[ 5]   MD5_SINE[52], 21)   C;
  A := ROL(A   ((B or not D) xor C)   x[12]   MD5_SINE[53],  6)   B;
  D := ROL(D   ((A or not C) xor B)   x[ 3]   MD5_SINE[54], 10)   A;
  C := ROL(C   ((D or not B) xor A)   x[10]   MD5_SINE[55], 15)   D;
  B := ROL(B   ((C or not A) xor D)   x[ 1]   MD5_SINE[56], 21)   C;
  A := ROL(A   ((B or not D) xor C)   x[ 8]   MD5_SINE[57],  6)   B;
  D := ROL(D   ((A or not C) xor B)   x[15]   MD5_SINE[58], 10)   A;
  C := ROL(C   ((D or not B) xor A)   x[ 6]   MD5_SINE[59], 15)   D;
  B := ROL(B   ((C or not A) xor D)   x[13]   MD5_SINE[60], 21)   C;
  A := ROL(A   ((B or not D) xor C)   x[ 4]   MD5_SINE[61],  6)   B;
  D := ROL(D   ((A or not C) xor B)   x[11]   MD5_SINE[62], 10)   A;
  C := ROL(C   ((D or not B) xor A)   x[ 2]   MD5_SINE[63], 15)   D;
  B := ROL(B   ((C or not A) xor D)   x[ 9]   MD5_SINE[64], 21)   C;      Inc(FState[0], A);
  Inc(FState[1], B);
  Inc(FState[2], C);
  Inc(FState[3], D);    end;
//---------------------------------------------------------------------------
function ROL(AVal: LongWord; AShift: Byte): LongWord;
var r: LongWord;
begin
   r:= (AVal shl AShift) or (AVal shr (32 - AShift));
   Result := r;
end;    end.    
■ 使用方法
[BCB]    #include "classes.hpp"
#include "MyHashMD5.h"  //加入 include    void __fastcall TForm1::Button1Click(TObject *Sender)
{
  TFileStream *fs;
  String sFileName="c:\\clock3.wmv";  
  
  fs = new TFileStream(sFileName, fmOpenRead);       ShowMessage(HashValue(fs)); //秀出該檔案的 MD5 值      delete fs;    }    [Delphi]    uses MyHashMD5; //加入 uses    procedure TForm1.Button1Click(Sender: TObject);
var fs : TFileStream;
    FileHandle: Integer;
    sFileName: String;
begin
  sFileName:='c:\clock3.wmv';  
  fs := TFileStream.Create(sFileName, fmOpenRead);      ShowMessage(HashValue(fs)); //秀出該檔案的 MD5 值      fs.Free;
end;    
bruce0211
版主


發表:157
回覆:668
積分:279
註冊:2002-06-13

發送簡訊給我
#34 引用回覆 回覆 發表時間:2006-10-05 10:01:24 IP:211.78.xxx.xxx 未訂閱
【文章】讓 ADO 元件產生的 XML 檔給 ClientDataSet 元件使用 
【作者】源碼任務 bruce0211@yahoo.com.tw 2006/10/05
【內文】(本貼版格式有異常 , 有些程式碼內容被遮避 , 需要者再來信索取完整源碼)

■ 前言
目前因工作需要 , 不能透過需版權限制的 Connection 或 3'tier 架構連到資料庫 ,
故需將 QUERY 查詢結果變成文字檔格式 , 再透過檔案傳輸方式 ,
將資料轉給網路上的另一台電腦使用 , 相同的元件產生或讀取 XML 檔沒問題 ,
但 ADO 元件產生的 XML 檔餵給 ClientDataSet 元件使用就不行 ,
查了一下資料 , ClientDataSet 所使用的 XML 好像是一種所謂的 DataPacket 格式的 XML 檔 ,
BCB 6 及 Delphi 7 上好像有現成元件可做轉換動作 ,
另外 B6 & D7 也有提供一個叫 XML Mapper 的轉換工具 ,
不過無奈試了半天 , B6 & D7 提供的元件我試不出來 , 轉檔一直有問題
後來乾脆自己寫轉檔函式 , 在沒有 XML 轉檔元件的舊 B5 上也可使用
本函式尚未測試周全 , 用於一般資料型態(STRING , INT , FLOAT)應無問題
但遇到圖形或 MEMO 型態的欄位值 , 尚須再研究改寫
■ 用法
//寫出
//ADOQuery1->SaveToFile("c:\\test.xml",pfXML); //這種方式產生的 XML 不能給 ClientDataSet 用 (非 DataPacket 格式)
ADOQueryToDataPacket(ADOQuery1,"c:\\test.xml"); //要用自寫的函式來轉
//讀取
ClientDataSet1->LoadFromFile("c:\\test.xml");
ClientDataSet1->Open();
■ 函式
void __fastcall TForm1::ADOQueryToDataPacket(TADOQuery *TmpQuery, String fn)
{

TmpQuery->DisableControls();
String tmp="";
TStringList *TmpList= new TStringList;
TmpList->Clear();
tmp=tmp "<?xml version=\"1.0\" standalone=\"yes\" ?> ";
tmp=tmp "<METADATA><FIELDS>";
String datatype;
for (int i=0; iFieldCount; i )
{
tmp=tmp "Fields->Fields[i]->FieldName "\" fieldtype=\"";
switch (TmpQuery->Fields->Fields[i]->DataType)
{
case 0 : datatype="ftUnknown" ; break;
case 1 : datatype="ftString" ; tmp=tmp "string"; break;
case 2 : datatype="ftSmallint" ; break;
case 3 : datatype="ftInteger" ; tmp=tmp "i4"; break;
case 4 : datatype="ftWord" ; break;
case 5 : datatype="ftBoolean" ; break;
case 6 : datatype="ftFloat" ; tmp=tmp "r8"; break;
case 7 : datatype="ftCurrency" ; break;
case 8 : datatype="ftBCD" ; break;
case 9 : datatype="ftDate" ; break;
case 10 : datatype="ftTime" ; break;
case 11 : datatype="ftDateTime" ; tmp=tmp "dateTime"; break;
case 12 : datatype="ftBytes" ; break;
case 13 : datatype="ftVarBytes" ; break;
case 14 : datatype="ftAutoInc" ; break;
case 15 : datatype="ftBlob" ; break;
case 16 : datatype="ftMemo" ; break;
case 17 : datatype="ftGraphic" ; break;
case 18 : datatype="ftFmtMemo" ; break;
case 19 : datatype="ftParadoxOle" ; break;
case 20 : datatype="ftDBaseOle" ; break;
case 21 : datatype="ftTypedBinary" ; break;
case 22 : datatype="ftCursor" ; break;
case 23 : datatype="ftFixedChar" ; break;
case 24 : datatype="ftWideString" ; break;
case 25 : datatype="ftLargeint" ; break;
case 26 : datatype="ftADT" ; break;
case 27 : datatype="ftArray" ; break;
case 28 : datatype="ftReference" ; break;
case 29 : datatype="ftDataSet" ; break;
case 30 : datatype="ftOraBlob" ; break;
case 31 : datatype="ftOraClob" ; break;
case 32 : datatype="ftVariant" ; break;
case 33 : datatype="ftInterface" ; break;
case 34 : datatype="ftIDispatch" ; break;
case 35 : datatype="ftGuid" ; break;
}
if (TmpQuery->Fields->Fields[i]->DataType==1) //string 要再處理
{
tmp=tmp "\" WIDTH=\"" IntToStr(TmpQuery->Fields->Fields[i]->DataSize-1); // 為何要減 1 才對 ?
}
tmp=tmp "\" />";
}
tmp=tmp "</METADATA><ROWDATA>";

TmpQuery->First();
while(!TmpQuery->Eof)
{
tmp=tmp " for (int i=0; iFieldCount; i )
{
tmp = tmp TmpQuery->Fields->Fields[i]->FieldName "=\"";
tmp = tmp TmpQuery->Fields->Fields[i]->AsString "\" ";
}
tmp=tmp "/>";

TmpQuery->Next();
}
tmp=tmp "";
tmp=tmp "
";
TmpList->Add(tmp);
TmpList->SaveToFile(fn);
delete TmpList;
TmpQuery->EnableControls();
}
[<<] [1] [2] [>>]
系統時間:2024-04-26 8:16:04
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!