通过ODBC操作PostgreSQL

我刚开始时, OLE DB Provider 连接PostgreSQL数据库, 连接成功了, 查询操作也是正常的.

但是, 我用ADOQuery 添加数据时,出现"在行集中没有定义列",但是数据添加成功了.  郁闷中.

后来通过ODBC DSN方式, 完全正常.. 不过PostgreSQL与MSSQL 有一些差别.

如: delete table where id='1111'   (MSSQL 可以执行, 但是PGSQL就不行)

更新记录时, update table set 名称='1221'  where id='1111'  (MSSQL可以执行,PGSQL要出错.)

必须修改为: update table set  "名称"='1221'  where id='1111'  ,   哈哈...

最后附上截图和PGSQL windows ODBC驱动安装包.


odbcmanage.jpg

odbc1.jpg

odbc2.jpg

odbc3.jpg

psqlodbc.part1.rar

psqlodbc.part2.rar

psqlodbc.part3.rar

psqlodbc.part4.rar

psqlodbc.part5.rar

Posted in 软件开发 at January 26, 2007. by 傻猫 .    Views: 3744    No Comments

Delphi anti-loader

procedure   TForm1.FormCreate(Sender:   TObject);    
  var    
      isDebuggerPresent:   function:Boolean;    
      DllModule:   THandle;    
  begin    
      DllModule   :=   LoadLibrary('kernel32.dll');    
      isDebuggerPresent   :=   GetProcAddress(DllModule,   'IsDebuggerPresent');    
      if   isDebuggerPresent   then    
      begin    
          MessageBox(self.Handle,   '请不要调试我!',   '抗议',MB_OK   or   MB_ICONASTERISK);    
          Application.Terminate;    
      end;    
  end;    
   
  //anti-loader

Posted in 软件开发 at January 22, 2007. by 傻猫 .    Views: 2635    No Comments

检测DEDE反编译器

Procedure   Anti_DeDe();//检测DEDE反编译器,只对2.5版本以后的起作用.  
  var  
      DeDeHandle:THandle;  
      i:integer;  
  begin  
      DeDeHandle:=FindWindow(nil,chr($64)+chr($65)+chr($64)+chr($65));  
      if   DeDeHandle<>0   then  
          begin  
              For   i:=1   to   4500   do  
                  SendMessage(DeDeHandle,WM_CLOSE,0,0);  
          end;  
  end;  

Posted in 软件开发 at January 22, 2007. by 傻猫 .    Views: 2885    No Comments

Anti-Monitor Delphi反调试

//Anti-Monitor  
  Function   ABC39:   Boolean;   //检测Dump;  
  var  
      hFile:   Thandle;  
  Begin  
      Result:=   false;  
      hFile   :=   FindWindow(nil,'ProcDump32   (C)   1998,   1999,   2000   G-RoM,   Lorian   &   Stone');  
      if(   hFile   <>   0   )   then  
      begin  
          Result:=   TRUE;  
      end;  
  End;  
   
  Function   ABC40:   Boolean;   //检测RegMON;  
  var  
      hFile:   Thandle;  
  Begin  
      Result:=   false;  
      hFile   :=   FindWindow(nil,'Registry   Monitor   -   Sysinternals:   www.sysinternals.com');  
      if(   hFile   <>   0   )   then  
      begin  
          Result:=   TRUE;  
      end;  
  End;  
   
  Function   ABC41:   Boolean;stdcall;     //检测FileMON;  
  var  
      hFile:   Thandle;  
  Begin  
      Result:=   false;  
      hFile   :=   FindWindow(nil,'File   Monitor   -   Sysinternals:   www.sysinternals.com');  
      if(   hFile   <>   0   )   then  
      begin  
          Result:=   TRUE;  
      end;  
  End;  
   
  ////////////////////////////////////////////////////////////////////////////////  
  //Anti-loader  
  Function   ABC42():Boolean;   //检测调试器;  
  var  
      YInt,NInt:Integer;  
  begin  
      asm  
          mov   eax,fs:[30h]  
          movzx   eax,byte   ptr[eax+2h]  
          or   al,al  
          jz   @No  
          jnz   @Yes  
          @No:  
              mov   NInt,1  
          @Yes:  
              Mov   YInt,1  
      end;  
      if   YInt=1   then  
          Result:=True;  
      if   NInt=1   then  
          Result:=False;  
  end;  
   
  98下:  
  Function   IsSoftIce95Loaded:   boolean;         //声明一个检测SoftICE的boolean型变量    
  Var   hFile:   Thandle;    
  Begin    
      result   :=   false;    
      hFile   :=   CreateFileA('\\.\SICE',   GENERIC_READ   or   GENERIC_WRITE,    
          FILE_SHARE_READ   or   FILE_SHARE_WRITE,   nil,   OPEN_EXISTING,    
          FILE_ATTRIBUTE_NORMAL,   0);    
      if(   hFile   <>   INVALID_HANDLE_VALUE   )   then   begin    
          CloseHandle(hFile);    
          result   :=   TRUE;    
      end;    
  End;    
   
  Function   IsSoftIceNTLoaded:   boolean;     //声明一个检测SoftIceNT的boolean型变量    
  Var   hFile:   Thandle;    
  Begin    
      result   :=   false;    
      hFile   :=   CreateFileA('\\.\NTICE',   GENERIC_READ   or   GENERIC_WRITE,    
          FILE_SHARE_READ   or   FILE_SHARE_WRITE,   nil,   OPEN_EXISTING,    
          FILE_ATTRIBUTE_NORMAL,   0);    
      if(   hFile   <>   INVALID_HANDLE_VALUE   )   then   begin    
          CloseHandle(hFile);    
          result   :=   TRUE;    
      end;    
  End;    
   
  Function   IsTRWLoaded:   boolean;     //声明一个检测TRW的boolean型变量  
  Var   hFile:   Thandle;    
  Begin  
      result   :=   false;    
      hFile   :=   CreateFileA('\\.\TRWDEBUG',   GENERIC_READ   or   GENERIC_WRITE,    
          FILE_SHARE_READ   or   FILE_SHARE_WRITE,   nil,   OPEN_EXISTING,    
          FILE_ATTRIBUTE_NORMAL,   0);    
      if(   hFile   <>   INVALID_HANDLE_VALUE   )   then   begin    
          CloseHandle(hFile);    
          result   :=   TRUE;    
      end;    
  End;  
   
  Function   IsTRW2000Loaded:   boolean;     //声明一个检测TRW2000的boolean型变量  
  Var   hFile:   Thandle;    
  Begin    
      result   :=   false;    
      hFile   :=   CreateFileA('\\.\TRW2000',   GENERIC_READ   or   GENERIC_WRITE,    
          FILE_SHARE_READ   or   FILE_SHARE_WRITE,   nil,   OPEN_EXISTING,    
          FILE_ATTRIBUTE_NORMAL,   0);    
      if(   hFile   <>   INVALID_HANDLE_VALUE   )   then   begin    
          CloseHandle(hFile);    
          result   :=   TRUE;  
      end;    
  End;    
   
  Function   IsRegMONLoaded:   boolean;     //声明一个检测RegMON的boolean型变量   For   Windows98;  
  Var   hFile:   Thandle;    
  Begin    
      result   :=   false;    
      hFile   :=   CreateFileA('\\.\REGVXD',   GENERIC_READ   or   GENERIC_WRITE,    
          FILE_SHARE_READ   or   FILE_SHARE_WRITE,   nil,   OPEN_EXISTING,    
          FILE_ATTRIBUTE_NORMAL,   0);    
      if(   hFile   <>   INVALID_HANDLE_VALUE   )   then   begin    
          CloseHandle(hFile);    
          result   :=   TRUE;    
      end;    
  End;    
   
  Function   IsNTRegMONLoaded:   boolean;     //声明一个检测RegMON的boolean型变量   For   Windows2000/xp;    
  Var   hFile:   Thandle;  
  Begin  
      result   :=   false;  
      hFile   :=   FindWindow(nil,'Registry   Monitor   -   Sysinternals:   www.sysinternals.com');  
      if(   hFile   <>   0   )   then  
      begin  
          result   :=   TRUE;  
      end;  
  End;  
   
  Function   IsFileMONLoaded:   boolean;         //声明一个检测FileMON的boolean型变量   For   Windows98;  
  Var   hFile:   Thandle;    
  Begin    
      result   :=   false;    
      hFile   :=   CreateFileA('\\.\FILEVXD',   GENERIC_READ   or   GENERIC_WRITE,    
          FILE_SHARE_READ   or   FILE_SHARE_WRITE,   nil,   OPEN_EXISTING,    
          FILE_ATTRIBUTE_NORMAL,   0);    
      if(   hFile   <>   INVALID_HANDLE_VALUE   )   then   begin    
          CloseHandle(hFile);    
          result   :=   TRUE;    
      end;    
  End;    
   
  Function   IsBW2000Loaded:   boolean;     //声明一个检测冲击波2000的boolean型变量   加壳时说不定用的上  
  Var   hFile:   Thandle;  
  Begin  
      result   :=   false;  
      hFile   :=   CreateFileA('\\.\bw2k',   GENERIC_READ   or   GENERIC_WRITE,  
          FILE_SHARE_READ   or   FILE_SHARE_WRITE,   nil,   OPEN_EXISTING,  
          FILE_ATTRIBUTE_NORMAL,   0);  
      if(   hFile   <>   INVALID_HANDLE_VALUE   )   then   begin  
          CloseHandle(hFile);  
          result   :=   TRUE;  
      end;  
  End;  
   
   
  上面的调用就是根据返回值True或者False来检测的.

Posted in 软件开发 at January 22, 2007. by 傻猫 .    Views: 3942    No Comments

检测Win2000/XP下的SoftIce

Function   ABC38:Boolean;//检测Win2000/XP下的SoftIce  
  var  
      mark:Integer;  
      YesInt,NoInt:Integer;  
  begin  
      YesInt:=0;NoInt:=0;  
      mark:=0;  
      asm  
          push   offset   @handler  
          push   dword   ptr   fs:[0]  
          mov     dword   ptr   fs:[0],esp  
          xor     eax,eax  
          int   1  
          inc     eax  
          inc     eax  
          pop     dword   ptr   fs:[0]  
          add   esp,4  
          or       eax,eax  
          jz       @found  
          cmp   mark,   0  
          jnz       @found  
          jmp     @Nofound  
          @handler:  
              mov   ebx,[esp+0ch]  
              add   dword   ptr   [ebx+0b8h],02h  
              mov   ebx,[esp+4]  
              cmp   [ebx],   80000004h  
              jz   @Table  
              inc   mark  
          @Table:  
              xor   eax,eax  
            ret  
          @found:  
              mov   YesInt,1  
          @Nofound:  
              mov   NoInt,1  
      end;  
      if   Yesint=1   then  
          Result:=True;  
      if   NoInt=1   then  
          Result:=False;  
  end;   
   

Posted in 软件开发 at January 22, 2007. by 傻猫 .    Views: 2828    No Comments

校验注册码时的技巧

在进行注册码比较的时候要注意(En代表加密函数)  
  if   En(系列号)=En(注册码)   then  
      ShowMessage('注册成功!')  
  else  
      ShowMessage('注册失败');  
  如果是这样进行判断的话,那么注册码在内存当中就可以直接看到了。避免这样的情况发生.你可以对比较的值进行移位操作这样在内存中出现的值就不是真正的注册码.  
  if   ShlStr(En(系列号))=ShlStr(En(注册码))   then  
      ShowMessage('注册成功!')  
  else  
      ShowMessage('注册失败');  
  还有就是注册成功和注册失败的时候不要作任何的提示,只是可用和不可用功能.  
   
  移位的函数我给出一个,其实你自己可以写自己的移位函数,我只是给出一个参考的:   

  Function   ShlStr(Str:PChar):PChar;   //进行明码变换;  
  var  
      a:LongWord;  
      Int1,Int2:Integer;  
      j,j1:Integer;  
      sum:LongWord;  
      Str1:String;  
  begin  
          Str1:=StrPas(ABC44Str);  
          Int2:=Length(Str1);  
          for   j1:=1   to   Int2   do  
              begin  
                  a:=ord(Str1[j1])   shl   7;  
                  sum:=sum+a;  
              end;  
          Result:=PChar(IntToStr(sum));  
  end;  

Posted in 软件开发 at January 22, 2007. by 傻猫 .    Views: 3998    1 Comment

取MAC地址(集成网卡和非集成网卡)

取MAC地址(集成网卡和非集成网卡):  
  uses  
      nb30;  
   
  type  
  PASTAT   =   ^TASTAT;  
      TASTAT   =   record  
          adapter   :   TAdapterStatus;  
          name_buf   :   TNameBuffer;  
      end;  
  function   Getmac:string;  
  var  
      ncb   :   TNCB;  
      s:string;  
      adapt   :   TASTAT;  
      lanaEnum   :   TLanaEnum;  
      i,   j,   m   :   integer;  
      strPart,   strMac   :   string;  
  begin  
  FillChar(ncb,   SizeOf(TNCB),   0);  
      ncb.ncb_command   :=   Char(NCBEnum);  
      ncb.ncb_buffer   :=   PChar(@lanaEnum);  
      ncb.ncb_length   :=   SizeOf(TLanaEnum);  
      s:=Netbios(@ncb);  
      for   i   :=   0   to   integer(lanaEnum.length)-1   do  
      begin  
          FillChar(ncb,   SizeOf(TNCB),   0);  
          ncb.ncb_command   :=   Char(NCBReset);  
          ncb.ncb_lana_num   :=   lanaEnum.lana[i];  
          Netbios(@ncb);  
          Netbios(@ncb);  
          FillChar(ncb,   SizeOf(TNCB),   0);  
          ncb.ncb_command   :=   Chr(NCBAstat);  
          ncb.ncb_lana_num   :=   lanaEnum.lana[i];  
          ncb.ncb_callname   :=   '*                               ';  
          ncb.ncb_buffer   :=   PChar(@adapt);  
          ncb.ncb_length   :=   SizeOf(TASTAT);  
          m:=0;  
          if   (Win32Platform   =   VER_PLATFORM_WIN32_NT)   then  
          m:=1;  
          if   m=1   then  
          begin  
          if   Netbios(@ncb)   =   Chr(0)   then  
              strMac   :=   '';  
              for   j   :=   0   to   5   do  
              begin  
                  strPart   :=   IntToHex(integer(adapt.adapter.adapter_address[j]),   2);  
                  strMac   :=   strMac   +   strPart   +   '-';  
              end;  
              SetLength(strMac,   Length(strMac)-1);  
          end;  
      if   m=0   then  
          if   Netbios(@ncb)   <>   Chr(0)   then  
          begin  
              strMac   :=   '';  
              for   j   :=   0   to   5   do  
              begin  
                  strPart   :=   IntToHex(integer(adapt.adapter.adapter_address[j]),   2);  
                  strMac   :=   strMac   +   strPart   +   '-';  
              end;  
              SetLength(strMac,   Length(strMac)-1);  
          end;  
      end;  
  result:=strmac;  
  end;  
   
  function   PartitionString(StrV,PrtSymbol:   string):   TStringList;  
  var  
      iTemp:   integer;  
  begin  
      result   :=   TStringList.Create;  
      iTemp   :=   pos(PrtSymbol,StrV);  
      while   iTemp>0   do   begin  
          if   iTemp>1   then   result.Append(copy(StrV,1,iTemp-1));  
          delete(StrV,1,iTemp+length(PrtSymbol)-1);  
          iTemp   :=   pos(PrtSymbol,StrV);  
      end;  
      if   Strv<>''   then   result.Append(StrV);  
  end;  
   
  function   MacStr():String;  
  var  
      Str:TStrings;  
      i:Integer;  
      MacStr:String;  
  begin  
      MacStr:='';  
      Str:=TStringList.Create;  
      Str:=PartitionString(Getmac,'-');  
      for   i:=0   to   Str.Count-1   do  
          MacStr:=MacStr+Str[i];  
      Result:=MacStr;  
  end;  
   
  调用:  
  Edit1.text:=MacStr;

Posted in 软件开发 at January 22, 2007. by 傻猫 .    Views: 2839    No Comments

取MAC(非集成网卡):

取MAC(非集成网卡):  
  usese  
      nb30;  
   
  function   NBGetAdapterAddress(a:   Integer):   string;  
  var  
      NCB:   TNCB;   //   Netbios   control   block   //NetBios控制块  
      ADAPTER:   TADAPTERSTATUS;   //   Netbios   adapter   status//取网卡状态  
      LANAENUM:   TLANAENUM;   //   Netbios   lana  
      intIdx:   Integer;   //   Temporary   work   value//临时变量  
      cRC:   Char;   //   Netbios   return   code//NetBios返回值  
      strTemp:   string;   //   Temporary   string//临时变量  
  begin  
      //   Initialize  
      Result   :=   '';  
      try  
          //   Zero   control   blocl  
          ZeroMemory(@NCB,   SizeOf(NCB));  
          //   Issue   enum   command  
          NCB.ncb_command   :=   Chr(NCBENUM);  
          cRC   :=   NetBios(@NCB);  
          //   Reissue   enum   command  
          NCB.ncb_buffer   :=   @LANAENUM;  
          NCB.ncb_length   :=   SizeOf(LANAENUM);  
          cRC   :=   NetBios(@NCB);  
          if   Ord(cRC)   <>   0   then  
              exit;  
          //   Reset   adapter  
          ZeroMemory(@NCB,   SizeOf(NCB));  
          NCB.ncb_command   :=   Chr(NCBRESET);  
          NCB.ncb_lana_num   :=   LANAENUM.lana[a];  
          cRC   :=   NetBios(@NCB);  
          if   Ord(cRC)   <>   0   then  
              exit;  
          //   Get   adapter   address  
          ZeroMemory(@NCB,   SizeOf(NCB));  
          NCB.ncb_command   :=   Chr(NCBASTAT);  
          NCB.ncb_lana_num   :=   LANAENUM.lana[a];  
          StrPCopy(NCB.ncb_callname,   '*');  
          NCB.ncb_buffer   :=   @ADAPTER;  
          NCB.ncb_length   :=   SizeOf(ADAPTER);  
          cRC   :=   NetBios(@NCB);  
          //   Convert   it   to   string  
          strTemp   :=   '';  
          for   intIdx   :=   0   to   5   do  
              strTemp   :=   strTemp   +   InttoHex(Integer(ADAPTER.adapter_address[intIdx]),   2);  
          Result   :=   strTemp;  
      finally  
      end;  
  end;  

 调用:  
  edit1.Text:=NBGetAdapterAddress(12);  

Posted in 软件开发 at January 22, 2007. by 傻猫 .    Views: 3585    No Comments