• 一、通过改变文件时间来限制软件的试用次数
    在MS-DOS中,文件的时间是 通过一个16位的值来保存的,位 15~11用来保存小时数,位10~5用 来保存分钟数,位4~0用来保存秒钟 数。这个16位的值正好可以被我们用来保存试用次数。例如,在下面的示例 程序中,笔者就使用了保存分钟数的 位来保存试用次数。运行一下示例程序,我们可以看到,只是文件时间的分 钟数加了1,一般人很难察觉,这种方 法有比较好的隐蔽性。
    二、示例程序中所涉及的中断
    1.中断21H的功能3DH
    用途:打开文件用于读。写或补 充。
    调用寄存器:AH=3DH,AL=00H,DS:DX=文件名;
    返回寄存器:CF 复位--成功,AX=文件把柄。
    CF 置位--出错,AX=错误代码。
    2.中断21H的功能3EH
    用途:强迫清除所有缓冲区,更新目录,使文件把 柄无效。
    调用寄存器:AH=3EH,BX=文件把柄;
    返回寄存器:CF 复位--成功,AX被破坏,
    CF 置位--出错,AX=错误代码。
    3.中断21H的功能57H、子功能00H
    用途:读出文件被最后修改的日期和时间。
    调用寄存器:AX=5700H,BX=文件把柄;
    返回寄存器:CF 复位--成功,CX=文件时间, DX=文件日期,
    CF 置位--出错,AX=错误代码。
    4。中断21H的功能57H、子功能01H
    用途:将文件最后被修改过的日期和时间信息变 成指定值。
    调用寄存器:AX=5701H,BX=文件把柄,CX= 新时间,DX=新日期;
    返回寄存器:CF 复位--成功,
    CF 置位--出错,AX=错误代码。
    三、示例程序
    #include <sidio.h>
    #include <dos.h>
    #include <conio.h>
    int count( )
    {
    union REGS inregs,outregs;
    strut SREGS segs;
    unsigned handle;
    unsigned times;
    / * 打开文件 * /
    inregs.h.ah =0x3d;
    inregs.h.al =0;
    scgread(& segs);
    inregs.x.dx ="test.exe";
    intdosx(& inregs, & outregs, & segs);
    if(outregs.x.cflag) return(0);
    else
    {
    / * 读取文件日期时间 * /
    handle = Outregs.x.ax;
    inregs.x.ax = 0x5700;
    inregs.x.bx = handle;
    intdosx(& inregs, & outregs, &segs);
    times = (outregs.x.cx &0x7e0)> > 5;
    if(times <40)/ * 试用次数可以通过改变此处的’40’来实现 * /
    {
    inregs.x.ax = 0x5701;
    inregs.x.bx = handle;
    inregs.x.cx = outregs.x.cx + 0x20; / * 试用次数计数 * /
    inregs.x.dx = outregs.x.dx;
    intdosx(& inregs, & outregs, & segs); / * 重置日期时间 * /
    return(2);
    }
    else return(1);
    / * 关闭文件 * /
    inregs.h.ah = 0x3e;
    inregs.x.bx = handle;
    intdosx(& inregs, & outregs, & segs);
    }
    }
    main()
    {
    int flag;
    flag = count();
    if(flag==0) printf("此软件为试用版,请勿任意修改!\ n");
    if(flag==1) printf("此软件为试用版,您的试用次数已满!\n");
    if(flag==2) printf("此软件为试用版,欢迎试用!\n");
    }




    目前,许多应用程序都有在一定限制条件内免费使用的功能,利用该功能可以有效限制非法用户的使用,同时,还可以使合法用户在充分了解软件优缺点的基础上,再决定是否购买。本文称实现这种功能的方法为保护方法。保护方法的利用在保护正版软件的基础上,既有效地扩大了软件的使用范围,又给用户提供了进行充分选择的机会。
    保护方法
    本文介绍4种利用C++ Builder实现的保护方法:
    利用注册表限制程序使用的天数,比如限制使用30天;
    利用注册表限制程序使用的次数,比如限制使用45次;
    设定程序使用的截止日期,比如设截止日期为2001年8月31日;
    限制每次使用程序的时间,比如一次允许使用50分钟。
    这些保护方式既可以单独使用,也可以几个同时使用实现综合保护。
    编程思路
    1.方法1和方法2
    在程序主窗体的OnCreate事件过程中,定义注册表TRegistry类对象指针Reg:
    TRegistry *Reg = new TRegistry;
    通过其属性RootKey定位注册表根键,如:
    Reg->RootKey = HKEY_USERS;
    //可根据需要选择
    利用OpenKey方法打开根键下的一个自定义主键,例如:
    Reg->OpenKey(“.DEFAULT\\Myprogram\\Records”, false)
    若该主键不存在(即首次运行本程序时),需要利用CreateKey()方法创建该主键,并将其打开,写入子键及键值如下(参见图1):
    //“Count”键值记录本程序运行次数
    Reg->WriteInteger(“Count”,1);
    //“Flag”键值记载本程序使用是否有过期的记录
    Reg->WriteInteger(“Flag”,0);
    //“First”键值记录首次运行本程序的日期
    Reg->WriteDate(“First”,Date());
    //“Last”键值记录上一次运行本程序的日期
    Reg->WriteDate(“Last”,Date());



    图 1


    通过对“First”键值的读取获得首次运行程序时的日期,再与系统当前的日期进行比较,判断是否超过指定的天数而决定是否终止程序的运行,从而实现使用天数的限制。通过对“Count”键值的读取获得程序使用的次数,判断是否超过指定的次数而决定是否终止程序的运行,以实现使用次数的限制。
    此外,通过读取“Flag”键值可以了解程序是否有过期记
  • 丁有和
      Visual C++.NET涉及到ATL/ATL Server、MFC和托管C++等多种编程方式,不仅功能强大而且应用广泛。在编程中,我们常常会遇到ANSI、Unicode以及BSTR不同编码类型的字符串转换操作。本文先介绍基本字符串类型,然后说明相关的类,如CComBSTR、_bstr_t、CStringT等,最后讨论它们的转换方法,其中还包括使用最新ATL7.0的转换类和宏,如CA2CT、CA2TEX等。

      一、BSTR、LPSTR和LPWSTR

      在Visual C++.NET的所有编程方式中,我们常常要用到这样的一些基本字符串类型,如BSTR、LPSTR和LPWSTR等。之所以出现类似上述的这些数据类型,是因为不同编程语言之间的数据交换以及对ANSI、Unicode和多字节字符集(MBCS)的支持。

      那么什么是BSTR、LPSTR以及LPWSTR呢?

      BSTR(Basic STRing,Basic字符串)是一个OLECHAR*类型的Unicode字符串。它被描述成一个与自动化相兼容的类型。由于操作系统提供相应的API函数(如SysAllocString)来管理它以及一些默认的调度代码,因此BSTR实际上就是一个COM字符串,但它却在自动化技术以外的多种场合下得到广泛使用。图1描述了BSTR的结构,其中DWORD值是字符串中实际所占用的字节数,且它的值是字符串中Unicode字符的两倍。

      LPSTR和LPWSTR是Win32和VC++所使用的一种字符串数据类型。LPSTR被定义成是一个指向以NULL(‘\0’)结尾的8位ANSI字符数组指针,而LPWSTR是一个指向以NULL结尾的16位双字节字符数组指针。在VC++中,还有类似的字符串类型,如LPTSTR、LPCTSTR等,它们的含义如图2所示。

      例如,LPCTSTR是指“long pointer to a constant generic string”,表示“一个指向一般字符串常量的长指针类型”,与C/C++的const char*相映射,而LPTSTR映射为 char*。

      一般地,还有下列类型定义:

    #ifdef UNICODE
     typedef LPWSTR LPTSTR;
     typedef LPCWSTR LPCTSTR;
    #else
     typedef LPSTR LPTSTR;
     typedef LPCSTR LPCTSTR;
    #endif

      二、CString、CStringA 和 CStringW

      Visual C++.NET中将CStringT作为ATL和MFC的共享的“一般”字符串类,它有CString、CStringA和CStringW三种形式,分别操作不同字符类型的字符串。这些字符类型是TCHAR、char和wchar_t。TCHAR在Unicode平台中等同于WCHAR(16位Unicode字符),在ANSI中等价于char。wchar_t通常定义为unsigned short。由于CString在MFC应用程序中经常用到,这里不再重复。

      三、VARIANT、COleVariant 和_variant_t

      在OLE、ActiveX和COM中,VARIANT数据类型提供了一种非常有效的机制,由于它既包含了数据本身,也包含了数据的类型,因而它可以实现各种不同的自动化数据的传输。下面让我们来看看OAIDL.H文件中VARIANT定义的一个简化版:

    struct tagVARIANT {
     VARTYPE vt;
     union {
      short iVal; // VT_I2.
      long lVal; // VT_I4.
      float fltVal; // VT_R4.
      double dblVal; // VT_R8.
      DATE date; // VT_DATE.
      BSTR bstrVal; // VT_BSTR.
      …
      short * piVal; // VT_BYREF|VT_I2.
      long * plVal; // VT_BYREF|VT_I4.
      float * pfltVal; // VT_BYREF|VT_R4.
      double * pdblVal; // VT_BYREF|VT_R8.
      DATE * pdate; // VT_BYREF|VT_DATE.
      BSTR * pbstrVal; // VT_BYREF|VT_BSTR.
     };
    };

      显然,VARIANT类型是一个C结构,它包含了一个类型成员vt、一些保留字节以及一个大的union类型。例如,如果vt为VT_I2,那么我们可以从iVal中读出VARIANT的值。同样,当给一个VARIANT变量赋值时,也要先指明其类型。例如:

    VARIANT va;
    :: VariantInit(&va); // 初始化
    int a = 2002;
    va.vt = VT_I4; // 指明long数据类型
    va.lVal = a; // 赋值

      为了方便处理VARIANT类型的变量,Windows还提供了这样一些非常有用的函数:

      VariantInit —— 将变量初始化为VT_EMPTY;

      VariantClear —— 消除并初始化VARIANT;

      VariantChangeType —— 改变VARIANT的类型;

      VariantCopy —— 释放与目标VARIANT相连的内存并复制源VARIANT。

      COleVariant类是对VARIANT结构的封装。它的构造函数具有极为强大大的功能,当对象构造时首先调用VariantInit进行初始化,然后根据参数中的标准类型调用相应的构造函数,并使用VariantCopy进行转换赋值操作,当VARIANT对象不在有效范围时,它的析构函数就会被自动调用,由于析构函数调用了VariantClear,因而相应的内存就会被自动清除。除此之外,COleVariant的赋值操作符在与VARIANT类型转换中为我们提供极大的方便。例如下面的代码:

    COleVariant v1("This is a test"); // 直接构造
    COleVariant v2 = "This is a test";
    // 结果是VT_BSTR类型,值为"This is a test"
    COleVariant v3((long)2002);
    COleVariant v4 = (long)2002;
    // 结果是VT_I4类型,值为2002

      _variant_t是一个用于COM的VARIANT类,它的功能与COleVariant相似。不过在Visual C++.NET的MFC应用程序中使用时需要在代码文件前
  • 出处:中国网侠联盟
    1、扎实的基础

      数据结构、离散数学、编译原理,这些是所有计算机科学的基础,如果不掌握它们,很难写出高水平的程序。程序人人都会写,但当你发现写到一定程度很难再提高的时候,就应该想想是不是要回过头来学学这些最基本的理论。不要一开始就去学OOP,即使你再精通OOP,遇到一些基本算法的时候可能也会束手无策。因此多读一些计算机基础理论方面的书籍是非常有必要的。

    2、丰富的想像力

      不要拘泥于固定的思维方式,遇到问题的时候要多想几种解决问题的方案,试试别人从没想过的方法。丰富的想像力是建立在丰富的知识的基础上,除计算机以外,多涉猎其他的学科,比如天文、物理、数学等等。开阔的思维对程序员来说很重要。

    3、最简单的是最好的

      这也许是所有科学都遵循的一条准则,复杂的质能转换原理在爱因斯坦眼里不过是一个简单得不能再简单的公式:E=mc2。简单的方法更容易被人理解,更容易实现,也更容易维护。遇到问题时要优先考虑最简单的方案,只有简单方案不能满足要求时再考虑复杂的方案。

    4、不钻牛角尖

      当你遇到障碍的时候,不妨暂时远离电脑,看看窗外的风景,听听轻音乐,和朋友聊聊天。当我遇到难题的时候会去玩游戏,当负责游戏的那部分大脑细胞极度亢奋的时候,负责编程的那部分大脑细胞就得到了充分的休息。当重新开始工作的时候,我会发现那些难题现在竟然可以迎刃而解。

    5、对答案的渴求

      人类自然科学的发展史就是一个渴求得到答案的过程,即使只能知道答案的一小部分也值得我们去付出。只要你坚定信念,一定要找到问题的答案,你才会付出精力去探索,即使最后没有得到答案,在过程中你也会学到很多东西。

    6、多与别人交流

      三人行必有我师,也许在一次和别人不经意的谈话中,就可以迸出灵感的火花。多上上网,看看别人对同一问题的看法,会给你很大的启发。


    7、良好的编程风格

      注意养成良好的习惯,代码的缩进编排,变量的命名规则要始终保持一致。大家都知道如何排除代码中错误,却往往忽视了对注释的排错。注释是程序的一个重要组成部分,它可以使你的代码更容易理解,而如果代码已经清楚地表达了你的思想,就不必再加注释了,如果注释和代码不一致,那就更加糟糕。

    8、韧性和毅力

      这也许是“高手”和一般程序员最大的区别。高手们并不是天才,他们是在无数个日日夜夜中磨炼出来的。成功能给我们带来无比的喜悦,但过程却是无比的枯燥乏味。你不妨做个测试,找个10000以内的素数表,把它们全都抄下来,然后再检查三遍,如果能够不间断地完成这一工作,你就可以满足这一条。
  • [face27] Three ways to get your MAC address
    [face27] Obtain all IP addresses of local machine
    [face27] Reading Hard Drive Manufacturing Information


  • 2005-03-28

    取CPU序列号 - [转载收藏]

    #include <windows.h>
    #include <stdio.h>

    bool DetectSerialNumber()
    {


    bool found_sn;
    _asm
    {


    pushfd
    pop eax // get EFLAGS into eax
    mov ebx,eax // keep a copy
    xor eax,0x200000 // toggle CPUID bit
    push eax
    popfd // set new EFLAGS
    pushfd
    pop eax // EFLAGS back into eax


    // have we changed the ID bit?
    xor eax,ebx

    je NO_SERIAL_NUM

    // we could toggle the bit so CPUID
    // is present
    mov eax,1

    cpuid // get processor features

    // check the serial number bit
    test edx,1<<18

    jz NO_SERIAL_NUM
    mov found_sn,1
    jmp DONE
    NO_SERIAL_NUM:
    mov found_sn,0
    DONE:



    }

    return found_sn;

    }
    void ReadSerialNumber(DWORD* serial)
    {

    DWORD t,m,b;
    _asm
    {


    mov eax,1
    cpuid

    // top 32 bits are the processor
    // signature bits
    mov t,eax

    // A new CPUID code for the
    // Pentium III
    mov eax,3


    cpuid
    mov m,edx
    mov b,ecx

    }

    // copy the locals into the pointer variables passed in
    serial[0] = b;
    serial[1] = m;
    serial[2] = t;

    }
    // Intel recommends displaying the serial number to the user as six groups of four hexidecimal digits, (i.e., xxxx-xxxx-xxxx-xxxx-xxxx-xxxx.).

    void main()
    {
    DWORD serial[3];
    if(DetectSerialNumber())
    {
    ReadSerialNumber(serial);
    printf ("PIII Serial Number = %04X-%04X-%04X-%04X-%04X-%04X\n",
    serial [0]&0xFFFF, serial [0] >> 16,
    serial [1]&0xFFFF, serial [1] >> 16,
    serial [2]&0xFFFF, serial [2] >> 16);
    }
    else
    {
    printf("Not found serial Number\n");
    }
    }
  • 2005-03-28

    取CPU频率 - [转载收藏]

    #include <windows.h>
    #include <stdio.h>

    int GetWindowsCpuFrequency()
    {
    DWORD eax1,edx1,eax2,edx2;
    __asm
    {
    rdtsc
    mov eax1,eax
    mov edx1,edx
    }
    Sleep(1000);
    __asm
    {
    rdtsc
    mov eax2,eax
    mov edx2,edx
    }

    eax2-=eax1;
    edx2-=edx1;

    edx2*=2147483647;
    edx2+=eax2;
    return (edx2 / 1024L / 1024L);
    }
  • [QUOTE]accwiz.exe > Accessibility Wizard for walking you through setting up your machine for your mobility needs. 辅助工具向导
    acsetups.exe > ACS setup DCOM server executable
    actmovie.exe > Direct Show setup tool 直接显示安装工具
    append.exe > Allows programs to open data in specified directories as if they were in the current directory. 允许程序打开制定目录中的数据
    arp.exe > NETWORK Display and modify IP - Hardware addresses 显示和更改计算机的IP与硬件物理地址的对应列表
    at.exe > AT is a scheduling utility also included with UNIX 计划运行任务
    atmadm.exe > Displays statistics for ATM call manager. ATM调用管理器统计
    attrib.exe > Display and modify attributes for files and folders 显示和更改文件和文件夹属性
    autochk.exe > Used to check and repair Windows File Systems 检测修复文件系统
    autoconv.exe > Automates the file system conversion during reboots 在启动过程中自动转化系统
    autofmt.exe > Automates the file format process during reboots 在启动过程中格式化进程
    autolfn.exe > Used for formatting long file names 使用长文件名格式
    bootok.exe > Boot acceptance application for registry
    bootvrfy.exe > Bootvrfy.exe, a program included in Windows 2000 that notifies the system that startup was successful. Bootvrfy.exe can be run on a local or remote computer. 通报启动成功
    cacls.exe > Displays or modifies access control lists (ACLs) of files. 显示和编辑ACL
    calc.exe > Windows Calculators 计算器
    cdplayer.exe > Windows CD Player CD播放器
    change.exe > Change { User | Port | Logon } 与终端服务器相关的查询
    charmap.exe > Character Map 字符映射表
    chglogon.exe > Same as using "Change Logon" 启动或停用会话记录
    chgport.exe > Same as using "Change Port" 改变端口(终端服务)
    chgusr.exe > Same as using "Change User" 改变用户(终端服务)
    chkdsk.exe > Check the hard disk for errors similar to Scandisk 3 Stages must specify a Drive Letter 磁盘检测程序
    chkntfs.exe > Same as using chkdsk but for NTFS NTFS磁盘检测程序
    cidaemon.exe > Component of Ci Filer Service 组成Ci文档服务
    cipher.exe > Displays or alters the encryption of directories [files] on NTFS partitions. 在NTFS上显示或改变加密的文件或目录
    cisvc.exe > Content Index -- Its the content indexing service for I 索引内容
    ckcnv.exe > Cookie Convertor 变换Cookie
    cleanmgr.exe > Disk Cleanup, popular with Windows 98 磁盘清理
    cliconfg.exe > SQL Server Client Network Utility SQL客户网络工具
    clipbrd.exe > Clipboard viewer for Local will allow you to connect to other clipboards 剪贴簿查看器
    clipsrv.exe > Start the clipboard Server 运行Clipboard服务
    clspack.exe > CLSPACK used to create a file listing of system packages 建立系统文件列表清单
    cluster.exe > Display a cluster in a domain 显示域的集群
    _cmd_.exe > Famous command prompt 没什么好说的!
    cmdl32.exe > Connection Manager Auto-Download 自动下载连接管理
    cmmgr32.exe > Connection Manager 连接管理器
    cmmon32.exe > Connection Manager Monitor 连接管理器监视
    cmstp.exe > Connection Manager Profile Manager 连接管理器配置文件安装程序
    comclust.exe > about cluster server 集群
    comp.exe > ComClust Add, Remove, or Join a cluster. 比较两个文件和文件集的内容*
    compact.exe > Displays or alters the compression of files on NTFS partitions. 显示或改变NTFS分区上文件的压缩状态
    conime.exe > Console IME IME控制台
    control.exe > Starts the control panel 控制面板
    convert.exe > Convert File System to NTFS 转换文件系统到NTFS
    convlog.exe > Converts MS IIS log files 转换IIS日志文件格式到NCSA格式
    cprofile.exe > Copy profiles 转换显示模式
    cscript.exe > MS Windows Scripts Host Version 5.1 较本宿主版本
    csrss.exe > Client Server Runtime Process 客户服务器Runtime进程
    csvde.exe > Comma Separated Variable Import/Export Utility 日至格式转换程序
    dbgtrace.exe > 和Terminal Server相关
    dcomcnfg.exe > Display the current DCOM configuration. DCOM配置属性
    dcphelp.exe > ?
    dcpromo.exe > Promote a domain controller to ADSI AD安装向导
    ddeshare.exe > Display DDE shares on local or remote computer DDE共享
    ddmprxy.exe >
    debug.exe > Runs Debug, a program testing and editing tool. 就是DEBUG啦!
    dfrgfat.exe >
  • #include <windows.h>
    #include <urlmon.h>
    #include <mshtmhst.h>


    /**************************************************************************

    WinMain()

    **************************************************************************/

    int PASCAL WinMain( HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPSTR lpCmdLine,
    int nCmdShow)
    {
    HINSTANCE hinstMSHTML = LoadLibrary(TEXT("MSHTML.DLL")); //装载动态连接库
    WCHAR url[]=L"http://rookieport.yourblog.org";//此地址名称可直接用html文件名代替

    if(hinstMSHTML)//装载动态连接库成功
    {
    SHOWHTMLDIALOGFN *pfnShowHTMLDialog;

    pfnShowHTMLDialog = (SHOWHTMLDIALOGFN*)GetProcAddress(hinstMSHTML, TEXT("ShowHTMLDialog"));

    if(pfnShowHTMLDialog)
    {
    IMoniker *moniker=NULL;

    //
    if( FAILED(CreateURLMoniker(NULL, (LPWSTR)url,&moniker ) ))
    {
    FreeLibrary(hinstMSHTML);
    return 0;
    }

    VARIANT varArgs;
    VARIANT varOut;
    VariantInit(&varOut);
    varArgs.vt = VT_BSTR;
    varArgs.bstrVal = SysAllocString(L"RookIE Browser");
    TCHAR *tcFeatures = "dialogWidth:100px;dialogHeight:100px;dialogLeft:0px;dialogTop:0px;";

    pfnShowHTMLDialog(NULL, moniker, &varArgs, tcFeatures, &varOut);

    VariantClear(&varArgs);

    if(moniker != NULL)
    moniker->Release();

    //显示成功,返回TRUE
    return 0;

    }
    else //GetProcessAddress失败
    return 0;

    FreeLibrary(hinstMSHTML);
    }
    else //装载动态连接库失败
    return 0;

    return 0;

    }

  • Win32API中有一组函数可以用来(同时)调整一个窗体内多个子控件的大小和位置。这里是我用这组API调整一个控件的例子,对于多个控件是同样可行的。
    RECT rcl; // 取得整个窗体客户区矩形
    HDWP hdwp; // 这里用来存储多个子窗体(控件)的位置信息

    // Get the client area of the parent window.
    GetClientRect(_hDlg, &rcl); // _hDlg是我的窗体句柄

    // We will be deferring four windows.
    hdwp = BeginDeferWindowPos(1); // 创建结构,参数1告诉它我将调整一个子窗体位置

    // 调整我的控件位置和大小,事实上我是让这个控件填充整个窗体.SWP_NOMOVE表示位置不变
    DeferWindowPos(hdwp, hBrowser, NULL, 0, 0,
    rcl.right - rcl.left, rcl.bottom - rcl.top, SWP_NOZORDER | SWP_NOMOVE);

    // 对于其他需要调整位置的控件则该如下调用
    /*DeferWindowPos(hdwp, g_Listing.hWndListView, NULL,
    left, top, width, height,
    SWP_NOZORDER );*/

    EndDeferWindowPos(hdwp); // 最后结束,应用各个窗体的新位置和大小

  • [QUOTE]算法注册机编写扫盲---第五课
    原创作者:我要[DFCG]
    =================================================================================

    注:接第四课,我又来了,这次想多余话都没有了。来!接着来吧。 ^_^

    这个课程一共写了五课,总算可以做一个总结或叫完结了!怎么,意尤未尽?没法,我要[DFCG]菜的不行的,只是将一些个人的所谓经验或心得拿来献丑而已,装酷了啊!砖头,烂柿子,臭鸡蛋一起掷过来了吧!先别啊,我还得说完再走的,你别赶我行不行了,我晕~~~~~~~~~
    =================================================================================

    一、到这里,应该说些什么内容呢?真的有点晕,以中级的来看,该说的都好象说了吧!还有什么好说的,想想~~~

    二、给些学习的方法吧!多试多练不就是了?还有说头的吗?有,还是坐下来看完这第五课吧!

    三、学着自已编写一个属于你的程式,看下面源码:

    Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long

    Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
    Label1.ForeColor = &HFF0000
    Label1.FontSize = 9
    Label2.ForeColor = &HFF0000
    Label2.FontSize = 9
    End Sub

    Private Sub label1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
    Label1.FontSize = 10
    Label1.ForeColor = &HC0&
    End Sub

    Private Sub label2_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
    Label2.FontSize = 10
    Label2.ForeColor = &HC0&
    End Sub

    Private Sub label1_Click()
    ShellExecute 0, "open", "http://218.63.244.68:1010/ckkd/index.php", vbNullString, vbNullString, 0
    End Sub

    Private Sub label2_Click()
    ShellExecute 0, "open", "http://dfcg.con.cn/", vbNullString, vbNullString, 0
    End Sub

    四、上面的词句,如果你对网页制作有那丁点认识也会看得明白的,看不懂?没事,复制到粘帖你总不至于也不会吧!好,因为网上有不小好的源码,所以这次我先上源码再接着说整个的框架。在源码里看,晕晕的不知所其言,关键你要看着源码要写出一个可执行的程式来,我作几个引点解释:

    Private Sub label1_Click() ← 这label1是?知道它就可应用源码自如了
    ShellExecute 0, "open", "http://218.63.244.68:1010/ckkd/index.php", vbNullString, vbNullString, 0
    End Sub

    Private Sub label2_Click() ← 工具箱(左边竖框)有个大写字母A,就是它
    ShellExecute 0, "open", "http://dfcg.con.cn/", vbNullString, vbNullString, 0
    End Sub

    五、现在你打开VB6,新建一个执行文件模板,好,光标点一下上面说的大写A字母,然后回到模板上拉出一个框条来,呵,里面你看到的是什么,“label1”要的就是它,因为源码是这样写的啊! ^_^

    六、重复第五步,你又拉出了一个“label2”来,够了,源码就这2个,以后你可以用这个源码去制作更多的链接。这例用2个就行多了就等于是违反源码原意,哈,你一定没好果子吃了。

    七、现在到属性窗口,就是右边的中间框。滚动下拉找到“Caption”,往右看看,label1放在那里了,知道怎样去做了吧!对,改写它,让它显示你所要的信息,以这个源码为例,这里改写为“DFCG官方论坛”,回模板看看,已经改写好了,光标放label2,同样的操作,改写为“DFCG短域名”。嗯,差不多要成功了,你现在用你的审美眼光,去布置好你的模板,加图片啊,改模板外观啊什么的,别急,慢着来,你一定会设计出一个好看的外观来的。

    八、最后用上面方法,再多拉出一个label3来,有用吗?有,这个你可以写上你想写的东西上去,比如,“我爱你,DFCG!” ^_^

    九、好,现在你就要将源码用复制粘贴的方法,将原码导入模板,不会做这步?哦,读书不用功,回头由第一课开始再看吧!

    十、嗯!都做好了,坐下来,抽杆烟。对,我每一步都做对的,那等什么,来啊,点工具栏,文件 → 下拉菜单点“生成工程1.exe”。当,出来了一个叫工程1的可执行文件,双击运行它看看,哈,你的设计完美吧?不管了,点一下上面的“DFCG官方论坛”,哦,打开的网页就是DFCG官方论坛,再点“DFCG短域名”,打开的也是DFCG官方论坛。成功了,这就是成功了啊,以后你只要将链接的地址改成你想去的就行。 &_^

    十一、我说老大,我一个是网址一个是邮箱你这个就不行了吧?对哦,怎么改写源码达到目的呢?嘿嘿,我先喝杯茶。来了,看下面:

    Private Sub label1_Click()
    ShellExecute 0, "open", "http://218.63.244.68:1010/ckkd/index.php", vbNullString, vbNullString, 0
    End Sub

    Private Sub label2_Cli
  • [QUOTE]算法注册机编写扫盲---第四课
    原创作者:我要[DFCG]
    =====================================================================

    注:接第三课,我又来了,这次没有多余的话。来!就以实例接着来吧。 ^_^

    某crackme算法分析

    嘿嘿!去年年初的时候,我发过这个东东,并做了动画教学破解并介绍了内存注册机的作法。这次还是用它,不过是算法注册机及算法的内容。对我本人来说,还是有点意义的。N久没看过自己的破文了,为了这第4课,又翻出来,哈,我啊,果然是菜的不行的那种!就找软柿子下手。 ^_^
    ======================================================================

    一、首先运行TRW2000指向step1.exe,然后隐藏。
    二、启动step1.exe
    三、输入注册名:woyao,注册码:7979,先不要点注册键。
    三、按Ctrl+N激活TRW2000

      下断点命令: bpx hmemcpy → 设置万能断点

    四、按F5返回,点击注册按钮,程序被拦截,下命令:

    bc* → 清除断点
    pmodule → 直接进入程序领空

    五、现在再按F10键N下(找到金矿),到如下代码:

    :004011B7 E8A4120000 call 00402460 ← 这里开始取注册名
    :004011BC 59 pop ecx
    :004011BD 8BC8 mov ecx, eax ← 注册名位数入ecx
    :004011BF 83F904 cmp ecx, 00000004 ← 一定大于或等于4
    :004011C2 7D14 jge 004011D8 ← 正确就跳到004011D8
    :004011C4 6A10 push 00000010

    * Possible StringData Ref from Data Obj ->\"ERROR\"
    |
    :004011C6 687CB14000 push 0040B17C

    * Possible StringData Ref from Data Obj ->\"Your name must contain at least \"
    ->\"4 characters! ← ?@_@?
    \
    :004011CB 684CB14000 push 0040B14C
    :004011D0 56 push esi

    * Reference To: USER32.MessageBoxA, Ord:0000h
    |
    :004011D1 E828900000 Call 0040A1FE
    :004011D6 EB67 jmp 0040123F

    * Referenced by a (U)nconditional or (C)onditional Jump at Address:
    |:004011C2(C)
    |
    :004011D8 33D2 xor edx, edx ← edx清零
    :004011DA 33C0 xor eax, eax ← eax清零
    :004011DC 3BC8 cmp ecx, eax ← 比较eax,ecx
    :004011DE 7E0D jle 004011ED ← 大于跳004011ED,结束运算
    * Referenced by a (U)nconditional or (C)onditional Jump at Address:
    |:004011EB(C)
    :004011E0 33DB xor ebx, ebx ← ebx清零,下面的注意看了
    :004011E2 8A5C05E4 mov bl, byte ptr [ebp+eax-1C] ← 注册名ASCII的16进制值移入ebx低位
    :004011E6 03D3 add edx, ebx
    :004011E8 40 inc eax ← 累加计数器
    :004011E9 3BC8 cmp ecx, eax ← 比较eax和ecx是否加完?
    :004011EB 7FF3 jg 004011E0 ← 小于跳到004011E0继续加

    * Referenced by a (U)nconditional or (C)onditional Jump at Address:
    |:004011DE(C)
    |
    :004011ED 52 push edx

    * Possible StringData Ref from Data Obj ->\"%d\"
    |
    :004011EE 6882B14000 push 0040B182
    :004011F3 8D45AC lea eax, dword ptr [ebp-54]
    :004011F6 50 push eax
    :004011F7 E8C0280000 call 00403ABC
    :004011FC 83C40C add esp, 0000000C
    :004011FF 8D55AC lea edx, dword ptr [ebp-54]
    :00401202 52 push edx
    :00401203 8D4DC8 lea ecx, dword ptr [ebp-38]
    :00401206 51 push ecx
    :00401207 E808120000 call 00402414 ← 关键call,注册码比较处
    :0040120C 83C408 add esp, 00000008
    :0040120F 85C0 test eax, eax
    :00401211 7517 jne 0040122A ← 不等就完蛋了! ? @_@ ?
    :00401213 6830000400 push 00040030

    * Possible StringData Ref from Data Obj ->\"You Did It!\"// ^_^
    |
    :00401218 68CEB14000 push 0040B1CE

    算法总结:
    crackme算法超简单,注册码等于注册名ASCII的16进制值相加后的10进制值
    算法举例:
    注册名:woyao
    注册码:119 + 111 + 121 + 97 + 111 = 559(十进制值)

    VB注册机源码:

    Private Sub Command1_Click()
    a = Text1.Text
    For i = 1 To Len(a)
    b = b + Asc(Mid$(a, i))
    Next i
    Text2.Text = b
    End Sub

    六、再来一个不久前的软件,算法分析已经有朋友写过了,这里不再从复,因为教程的目的是算法注册机的编写啊,来,看下面:

    全国电话通 Ver1.09.01注册算法

    算法总结如下:
    注册码=((机器码(转为十六进制)-3F9)/2D3+3F9)*2D3
    用户名可任意填写,因为它并不参与注册码的校验

    输入的机器码设为a,列出算式:

     ( (a - 3F9) / 2D3 + 3F9) * 2D3

    我的机器码:118866
    我的注册码:853140

    VB注册机源码见下面:

    Private Sub Command1_Click()
    strtmp = Text1.Text
    a = Val(Text1.Text)
  • [QUOTE]算法注册机编写扫盲---第三课
    原创作者:我要[DFCG]
    ======================================================================

    注:接第二课,我又来了,这次又得“胡说八道”题内话多多的了!为何?这样才可以更详细的说出个其所以然,还得保证你的心情轻松啊!好,来了,下面就以实例接着来吧。 ^_^

    一、看过前2课的朋友,现在你已经完全可以自己编译出难度为中的算法注册机,再难点的,比如,大数的,移位的,带小数点多位注册机,你还是不行,因为要应用相应的函数和控件什么的,这是后话,已经不是本篇的扫盲范围了,在以后的日子,你有需要时,可以找书本翻翻,找懂的朋友问一下,只要你虚心,应该是完全可以再进一步的。

    二、写到这里,有点晕头,用文字去表达这一课的内容可真有点范难的,真想随便做个动画就带过此课,哎,不过已经是开始了2课,没理由就这样不负责任的作出放弃的啊!嗯,好吧,我尽量写得哆嗦一点,详尽一点,希望大家真的能消化并看得明了就是!更因为我也菜的不行啊! ^_^

    三、先以编写最简单的算法注册机开始,说一下窗体的构建及应用吧!看这个之前,最好请先回看上2课的内容,作为加深一下认识,要不下面的你可能就不知我在说的是什么了。

    四、现在启动VB6,打开你的白板模板(此后就用模板表示,注意),上2课说过VB6左侧的功能应用,到这里该说说右面的功能应用,要不你是写不出个有个性的工程文件的。这就是要哆嗦的地方,我的用词已经尽量地不用专有名词,用最好理解的方式去表达了。嘿嘿~~ 是我要[DFCG]你自己不懂吧!哦,也许! ^_^

    五、好,看到没有,VB6的界面靠右侧,有一功能框,里面想要的都有,怎么用它啊?一般写注册机之类的小东东,你不需要全知道它的每一个选单的作用,这在你以后应用中一定会明了的,只不过是没个开始或没人引路而已。

    六、第一个框是工程框,你要构建你的个性化窗体,这里的你一定要认识它。因为以后你要添加个性化的说明或其它功能添加时,你就得用它去添加窗体等。好,你已经启动了你的模板,那这个框里就可见有“Form1 (Form1)”,用右键点出下拉菜单看看,里面有好多的选项,但其它的先别去看或暂时并不需要它。你看到里面有一个选项“添加”,光标放到这个行上,会出来选单的,看看:

    添加窗体
    添加MDI窗体
    添加模块
    添加类模块
    添加用户控件
    添加属性页
    添加用户文档
    添加文件

    七、看好了,上面的几个选项,从扫盲角度来说,只要知道第一个就够了,“添加窗体”的功能,这个能让你在以后的注册机上另添加上只属于你的说明文件或相片之类的。

    八、第二个框(属性框)看看,里面一大串由E文注明的应用选项,晕啊,我不懂E文怎办了啊?没事,只要记好常用的就行。看看:

    Alignment ← 所选项目的位置,有:左对齐,右对齐,居中
    Appearance
    AutoRedraw
    BackColor ← 改变特定文本框或窗体的颜色
    BorderStyle ← 改变标题栏的功能项,如“最小化”、“最大化”的开启关闭
    Caption ← 改变标题栏名称的地方,如写入“XXX注册机”
    ClipControls
    ControlBox
    DrawMode
    DrawStyle
    DrawWidth
    Enabled
    FillColor
    FillStyle
    Font ← 改变写入字体的大小等设定
    FontTransparen
    ForeColor ← 改变写入字体的颜色
    HasDC
    Height
    HelpContexID
    Icon ← 添加你的个性化图标,也就是注册机的图标了
    KeyPreview
    Left
    LinkMode
    LinkTopic
    MaxButton
    MDIChild
    MinButton
    MouseIcon
    MousePointer
    Moveable
    NegotiateMenus
    OLEDropMode
    Palette
    PeletteMode
    Picture ← 添加个性化图片,就是注册机窗体里的图版,需要配合左侧工具应用
    RightToLeft
    ScaleHeight
    ScaleLeft
    ScaleMode
    ScaleTop
    ScaleWidth
    ShowInTaskbar
    StartUpPositio ← 设定你的注册机弹出时所处窗口的位置
    Tag
    Top
    Visible
    WhatsThisButto
    WhatsThisHelp
    Width
    windowSTate

    九、初学的只要知道这些足够,还有我没注明的,以后再说或你查一下书本就会知道的。好了,现在开始我们的工作吧!我用甲、乙的方式表达,看下面:

    甲:我已经打开模板了,下一步怎样做?
    乙:好,将光标放右下角点上,然后向内线拖进去看看。
    甲:哦,这个作法就是改变整个窗体的外观大小的,明白了
    乙:再来,将光标放右边线上,横着向两边拉一下看看又有什么变化
    甲:明白,这一步是改变窗体的宽度
    乙:嗯,再将光标放底线,上下方向的拉一下看看
    甲:清楚了,这一步是改变窗体的高度
    乙:要使窗体个性化,你还要添加你的个性化图版的
    甲:怎样去做?
    乙:好,回看左侧,“ab”上面有个图形的图标,点一下,回到模板拉出一个框
    甲:做好了,我还要做什么才能将我的图片添加进去呢?
    乙:现在你得回到右侧的属性选项,找到“Picture”,点一下里面的“...”
    甲:呵,这里需要我指定图片的路径,明白了,我自己来做这一步吧
    乙:哈,这就以为成功了?这样添加图片以后,你会平添出一个多余的外
  • [QUOTE]算法注册机编写扫盲---第二课
    原创作者:我要[DFCG]
    ======================================================================

    注:接第一课,我又来了,这次不敢再“胡说八道”题外话多多的了!下面就以实例来说明一下用VB编写注册机吧。 ^_^


    一、上节所说的只是一个最为基本的算式,要做到应用在以后的算法总结编译注册机还差得很多,好,看下面算式:

    机器码 Xor 123456 = 注册码

    二、假设我的3台PC上各自的机器码为:12121212;13131313;14141414。那应该怎样去处理或编写出算法注册机呢?大家回看上节我的VB源码,嘿嘿,偷懒的我现在就去用我的精简原码用到上面这个算式上。怎么?通用的?看吧!

    Private Sub Command1_Click()
    strtmp = Text1.Text
    a = Val(Text1.Text)
    b = a Xor 123456
    Text2.Text = b
    End Sub

    三、原码里的a就是我们要填的机器码,b就是算式的结果,也就是注册码了,用上面这个源码,试一下自己去做一次,看看这个注册机是否能算出上面3个机器码的对应真注册码。我的结果是下面:

    机器码:12121212
    注册码:12129852

    机器码:13131313
    注册码:13220977

    机器码:14141414
    注册码:14034342

    四、呵呵,全对,你可以用计算器去验证一下这3个注册码是否正确,正确了吧!那就是说这个注册机可以在3台或更多的电脑上应用,随机器码的不同就能算出真实的注册码了! ^_^

    五、晕,你老这样算不行啊,我的不是十进制,算法我找到的是十六进制值,我怎么写了,再看下面源码,用这个源码编译注册机来看看吧!

    Private Sub Command1_Click()
    strtmp = Text1.Text
    a = Val(Text1.Text)
    b = a Xor &H1E240
    Text2.Text = b
    End Sub

    六、还是以上面的3个机器码为例,我得到的注册码见下面:

    机器码:12121212
    注册码:12129852

    机器码:13131313
    注册码:13220977

    机器码:14141414
    注册码:14034342

    七、哦,与上面的计算结果完全一样的?是的,因为十六进制1E240的十进值就是前面所列的123456,明白了吧!其实不管它是不是十进制或十六进制,一样地可以应用这个源码编译出注册机来的。大家可以多试多练,自已编一个计算器,应用你自编的计算器,得到的结果与windows计算器计算结果对比一下,本人以为多做有益的吧!最好的方式就是自编crackMe,因为你已经知道它的算法,所以写出它的算法注册机当是随手可得的了!怎写?这在第三课我再说,此节打住先。

    八、好,你现在已经上手,可以自己就能编写出算法注册机了!那么,就找几个软柿子下手,找到算法后,写出属于你的算法注册机吧。我找到几个东东,是N久以前的,因为它简单,适合下手,所以就用它。此处声明,算法破文非全是我之所写,是随手拿来一用,但请原破文作者见谅了! ^_^

    九、安利管理销售系统 V1.2 个人版,这个东东算法超简单,就用它来开刀吧!

    算法总结:

    机器码:0375458006 (转十六进制值为:166108D6)
    用166108D6与810613F异或运算的结果(1E7169E9),再将它转化为十进制就是你的注册码(510749161)。

    比如我机器码:0375458006
    真实我注册码:510749161

    十、好,找到算法了,那就用我的超省源码再次应用到这个算法注册机来,看:

    Private Sub Command1_Click()
    strtmp = Text1.Text
    a = Val(Text1.Text)
    b = a Xor &H810613F
    Text2.Text = b
    End Sub

    十一、编译方式参考上面文章内容,这里不再重复,免又“胡说八道”了! @_@

    十二、不过瘾了?好!再来一个,凌鹏光盘出租与销售系统 2.0算法简析,找到算法,列出算式看看,晕晕的,怎样去写算法注册机了啊?看下面:

    机器码转十六进值为A,注册码为Key,那么:
    Key=(A+A+87568F+875A6B+4F5DA2)+(A+A+87568F+875A6B+4F5DA2)*4
       (将上面计算结果十六进制值转化为十进制值就是你的注册码)

    如我的机器码为:65526转化为十六进制值为:FFF6
    Key=(A+A+87568F+875A6B+4F5DA2)+(A+A+87568F+875A6B+4F5DA2)*4
      =6E048A8(转十进值就是:115361960)

    比如我机器码:65526
    真实我注册码:115361960

    十三、知道算法及结果,那怎样去将算式编译成算法注册机,还是我的源码:

    Private Sub Command1_Click()
    strtmp = Text1.Text
    a = Val(Text1.Text)
    b = a + a
    c = b + &H15E0E9C
    d = c * &H4
    e = c + d
    Text2.Text = e
    End Sub

    十四、用这个源码去编译生成算法注册机,呵,算号成功,全对了!上面这段算法列算式时,你看着有点头晕眼花,但到我的源码上,嘿,看的爽心! ^_^

    十五、好了,回头作为复习,再来一个简单的加深一下你的学习过程,这个就是前些月的软件---六屏 V1.2,记得DFCG里的兄弟写过这个破文,先将该破文的算法总结借来一用先,看下面:

    这软件真的很可爱!!!
    将机器码 xor 11677831就是注册码!

    VB注册机源码如下(在win98+vb6.0下调试通过)
    Private Sub Command1_Click()
    strtmp
  • [QUOTE]算法注册机编写扫盲---第一课
    原创作者:我要[DFCG]
    ======================================================================

    编者注:
     大家好,看着一些兄弟的算法破文,感觉上该写该找的算法都找到找对了,好事,现在的cracker的水平可以说走上了一个新的台阶,内存注册机的制作对大多数人来说,已经熟门熟路,驾轻就熟的。但你写出算法的破文,想必在破解过程比追明码的要累的多,你成功的找到软件的加密算法,好,你不在是莱鸟的级别,已经进入中高级的程度。但由于不懂算法注册机的编写,发的算法破文,配的是内存注册机,这总有点美中不足的!怎么办,难不成要专一心重学一门语言?这就是我发此文的目的所在,让大家在轻松的情况下达到写出算法注册机目的。怎么样,想知道应该从哪里起步学习了吧!你不懂编程?没事,就写出个算法注册机而言,只应用相对的编程语言的百分之一就够了。
     晕,你懂才这样说的吧,我丁点不懂怎办?我连什么叫VB、VC、TC等,是什么东东都根本没个慨念,学,从何学起?!真有这种想法的朋友,你别在日后继续你逆向学习了,这最为起码的认知都没有,你靠的什么去找注册码和算法?所以嘛,闲话不多说了,进入正题吧!
    本篇原创作者--我要[DFCG],版权没有,人权我有 ^_^ 所以凡转此帖的友站及各路朋友兄弟们,必注明此文出自DFCG组织及我要[DFCG]原创为先决条件,否则谢绝转帖转载。网路本一家,但总不至于没个出处明示的吧!感谢你的阅读!


    我要[DFCG] 2003.12.03
    ======================================================================

    一、工具篇
     就写算法注册机而言,本人推荐你使用VB去做,为何?简单易学就是它的好处及我推荐的原因之所在根本,有兄弟说TC不更简单吗?也许吧,世界本无绝对只有相对,或许我这莱鸟只适合这种思维的方式。
     学不学是你的自由,想学的就得需要这个工具--Microsoft Visual Basic 6.0,版本与注册机的编译关系不大,不过VB6都出来这么久了,想想还是用这个版本吧,更因为在网上有它的精简中文版,大小才6M多的,不错,要的就是它,编写注册机之类的小东东,这个精简版足矣,到此还真的要感谢开发出这个精简版的朋友。你太好了,因为有你,所以才有我的这篇拙作。 ^_^

    二、了解VB6(当然以这个VB6精简版为框),你下载后就是安装,安装后在你的电脑桌面多了一个相应的快捷图标。呵,有点爽了,开始我们的学习吧!

    三、看三眼后,搓搓手,来吧,谁怕谁了?!我非得玩转你不可的。启动软件,晕眼了,我以前怎从没见过这种界面的。什么的什么。。@#$% ^_^

    四、再看一次界面,哦,窗口里有一个框,框里看看,默认位置“标准 EXE”已经点蓝,等着你去用它,看到这个框里的“打开”按钮没有?点一下它再看看,呵,出来一个新的窗体,这就是你的模板,但因为你什么都没做,所以是白板一个来的,不信你现在就在工具栏,文件 → 点“生成工程1.exe” → 选到你要保存的目标文件夹里。打开这个文件夹,你就会看到多了一个名为“工程1.exe”的东东,双击它看看,这下有点明白了吧。哈,你的处女作原来是个什么都没有的怪物。

    五、好了,放飞的心情别过于兴奋,回到学习上来,从复第四项,不过这次你别再去生成个白板怪物了。因为你的第一次只有一次,啊,有点象。。。???

    六、言归正传,学习编写注册机,你得先学会在VB6上学好编写四则运算及异或计算等的方法,怎样写啊!快说,再不说拉出去斩了这个“我要”得了。

    七、嘿,泡MM你们就有耐心,学编译就没个耐心的,再这样我看不起你。来吧,看下面的公式:1 + 2 * 3 / 3 = 3,这应该谁都能随口算出结果。不过在VB里变成一个程式,让它给我们算出结果才是我写此文的目的。明眼的朋友已经看出门道了,能做到这点,呵,算法注册机不就。。。。 ^_^

    八、回看上面的算式,因为它由算式与结果的表现为根本,那么你就应该用2个文本框来实现它,文本框?什么东东,在说什么了?别急嘛!在你的白板模板窗口看看,左边竖立的一串按钮,这里有你想要的一切,没有的在以后你需要时可以添加进去,此为后话。

    九、嗯,你现在点一下里面的“ab”按钮,然后将光标回到你的白板模板上,拉出一个框来,里面有“Text1”的提示,从复这步,再拉出一个框,这次来的就是“Text2”,好了,现在填算式及出结果的框有了,但“=”的键还没有,这个就等同于算法注册机里的算号键,因为是初学,这个键你就一定非添加不可,以后你上手了,用其它方式同样可以表示算式的结果,网上有些注册机这边输入注册码,另一边就出来结果(注册码),这不是初学者的范围,打住先。

    十、有了上面的2个框,现在来建一个“=”的功能键,点一下刚才的“ab”按钮正对下面的那个按钮,因为没注明功能在上面,我只能这样说了,点一下后,将光标回到你的白板模板上,拉出一个框来,这次出来的你一看就知道它是一个按钮功能键,里面有“Command1”的提示。好了,你的白板现在已经不再是白板了,你大可以回复到第四步
  • 在用水晶报表过程中,遇到凭空多出的白页,在CSDN上查找,也发现两个帖子在问这个

    问题,但没有得到合适的答案。于是自己摸索着,也找到一条方法,但感觉不是最完美

    的,希望有精通于此道的朋友赐教,多谢。
    CSDN中类似问题贴:
    http://community.csdn.net/Expert/topic/3305/3305114.xml?temp=.8683435
    http://community.csdn.net/Expert/topic/3458/3458844.xml?temp=.7499506
    http://community.csdn.net/Expert/topic/3178/3178158.xml?temp=.637356
    http://community.csdn.net/Expert/topic/3248/3248381.xml?temp=.3554804
    http://community.csdn.net/Expert/topic/3138/3138593.xml?temp=.1768915
    http://community.csdn.net/Expert/topic/3203/3203522.xml?temp=.8826868
    http://community.csdn.net/Expert/topic/3178/3178028.xml?temp=.8597223
    http://community.csdn.net/Expert/topic/3467/3467509.xml?temp=.2149469
    实际上这些问题贴子,感觉都没有得到一个完美的解答,我研究了一下发现问题的症结

    在于,我们没有办法控制报表内容的宽度(内容宽度属性只读),在打印过程中也不会

    多出空白页,只有在导出到Excel文档时,用分页预览,我们可以发现,对应的每一页

    右边都多出了一个空白页来,必须手动把页面调整过来,否则打印就会多出一倍的空白

    页。事实上我们不可能做这么繁琐的事情,调整了ExcelFormatOptions,调节导出后每

    个列的固定宽度。具体如下:
    ExcelFormatOptions excelFormatOpts = new

    ExcelFormatOptions();

    //’ Set the excel format options.
    excelFormatOpts.ExcelTabHasColumnHeadings = false;
    excelFormatOpts.ExcelUseConstantColumnWidth = true;
    excelFormatOpts.ExcelConstantColumnWidth = 24.0;
    oRpt.ExportOptions.FormatOptions = excelFormatOpts;
    oRpt.ExportToDisk(ExportFormatType.Excel,

    @"F:\LeadBridge\Tests\Report.xls");
    oRpt.Close();
    这样导出的Excel发现Excel内容列紧挨在一起,但导出的内容却是在一页的,打印的时候也是按实际页输出。不知道CSDN以上贴主遇到的问题是不是一样的,希望对他们有所帮助。

  • 开发过程中的数据库结构结构,不可避免的会需要反复的修改。最麻烦的情况莫过于开发者数据库结构已经修改,而实际应用中数据库又有大量数据,如何在不影响数据库中数据情况下,更新数据结构呢?当然,我们可以手工对应用数据库表结构各个添加、更正、删除的字段一一调整,这对一两个字段来说,是比较简单的,如果改动比较大的时候,这个过程将是非常繁琐的。本文意在介绍使用SQLServer2000 T-SQL语句进行数据库结构调整,希望能够给各位带来些方便。下面以现有数据库表HR_User为例,讲解如何进行这类操作。
    HR_User现有结构:
    [UserId] [int] NOT NULL ,用户Id,主键
    [UserName] [varchar] (50) NOT NULL ,用户姓名

    一、数据库添加新字段
    现在,需要在HR_User中添加字段用户昵称[NickName] [varchar] (50) 不为空,出生日期[Birthday] [datetime] 不为空。
    在开发数据库中我们已经添加了这两个字段,在查询分析器或者企业管理器中生成新表的构造语句如下:
    if exists (select * from dbo.sysobjects where id = object_id(N’[dbo].[HR_User]’) and OBJECTPROPERTY(id, N’IsUserTable’) = 1)
    drop table [dbo].[HR_User]
    GO

    CREATE TABLE [dbo].[HR_User] (
    [UserId] [int] NOT NULL ,
    [UserName] [varchar] (50) COLLATE Chinese_PRC_CS_AS NOT NULL ,
    [NickName] [varchar] (50) COLLATE Chinese_PRC_CS_AS NOT NULL ,
    [Birthday] [datetime] NOT NULL
    ) ON [PRIMARY]
    GO

    ALTER TABLE [dbo].[HR_User] ADD
    CONSTRAINT [DF_HR_User_UserId] DEFAULT (0) FOR [UserId],
    CONSTRAINT [DF_HR_User_UserName] DEFAULT (’’) FOR [UserName],
    CONSTRAINT [DF_HR_User_NickName] DEFAULT (’’) FOR [NickName],
    CONSTRAINT [DF_HR_User_Birthday] DEFAULT (getdate()) FOR [Birthday],
    CONSTRAINT [PK_HR_User] PRIMARY KEY CLUSTERED
    (
    [UserId]
    ) ON [PRIMARY]
    GO


    exec sp_addextendedproperty N’MS_Description’, N’出生日期’, N’user’, N’dbo’, N’table’, N’HR_User’, N’column’, N’Birthday’
    GO
    exec sp_addextendedproperty N’MS_Description’, N’用户昵称’, N’user’, N’dbo’, N’table’, N’HR_User’, N’column’, N’NickName’
    GO
    exec sp_addextendedproperty N’MS_Description’, N’用户Id’, N’user’, N’dbo’, N’table’, N’HR_User’, N’column’, N’UserId’
    GO
    exec sp_addextendedproperty N’MS_Description’, N’用户姓名’, N’user’, N’dbo’, N’table’, N’HR_User’, N’column’, N’UserName’
    GO
    这时候,我们来构建应用数据库的修改语句,T-SQL修改表结构添加新字段语法为Alter TABLE TableName Add,这样我们要添加两个字段就应该这样写:
    Alter TABLE [dbo].[HR_User] Add
    [NickName] [varchar] (50) COLLATE Chinese_PRC_CS_AS NOT NULL DEFAULT(’’),
    [Birthday] [datetime] NOT NULL DEFAULT(getdate())
    GO
    其实中间的语句只是简单的拷贝创建语句中对应两个字段的两句。再加上两句添加描述的语句,就大功告成。
    exec sp_addextendedproperty N’MS_Description’, N’出生日期’, N’user’, N’dbo’, N’table’, N’HR_User’, N’column’, N’Birthday’
    GO
    exec sp_addextendedproperty N’MS_Description’, N’用户昵称’, N’user’, N’dbo’, N’table’, N’HR_User’, N’column’, N’NickName’
    GO
    二、数据库修改字段
    现在我们发现UserName、NickName字段长度不够,需要修改为100
    Alter Table [HR_User] Alter
    Column [UserName] [varchar] (100) COLLATE Chinese_PRC_CS_AS NOT NULL
    GO

    Alter Table [HR_User] Alter
    Column [NickName] [varchar] (100) COLLATE Chinese_PRC_CS_AS NOT NULL
    GO

  • [QUOTE]1. 你们的项目组使用源代码管理工具了么?
    应该用。VSS、CVS、PVCS、ClearCase、CCC/Harvest、FireFly都可以。我的选择是VSS。

    2. 你们的项目组使用缺陷管理系统了么?
    应该用。ClearQuest太复杂,我的推荐是BugZilla。

    3. 你们的测试组还在用Word写测试用例么?
    不要用Word写测试用例(Test Case)。应该用一个专门的系统,可以是Test Manager,也可以是自己开发一个ASP.NET的小网站。主要目的是Track和Browse。

    4. 你们的项目组有没有建立一个门户网站?
    要有一个门户网站,用来放Contact Info、Baselined Schedule、News等等。推荐Sharepoint Portal Server 2003来实现,15分钟就搞定。买不起SPS 2003可以用WSS (Windows Sharepoint Service)。

    5. 你们的项目组用了你能买到最好的工具么?
    应该用尽量好的工具来工作。比如,应该用VS.NET而不是Notepad来写C#。用Notepad写程序多半只是一种炫耀。但也要考虑到经费,所以说是“你能买到最好的”。

    6. 你们的程序员工作在安静的环境里么?
    需要安静环境。这点极端重要,而且要保证每个人的空间大于一定面积。

    7. 你们的员工每个人都有一部电话么?
    需要每人一部电话。而且电话最好是带留言功能的。当然,上这么一套带留言电话系统开销不小。不过至少每人一部电话要有,千万别搞得经常有人站起来喊:“某某某电话”。《人件》里面就强烈谴责这种做法。

    8. 你们每个人都知道出了问题应该找谁么?
    应该知道。任何一个Feature至少都应该有一个Owner,当然,Owner可以继续Dispatch给其他人。

    9. 你遇到过有人说“我以为…”么?
    要消灭“我以为”。Never assume anything。

    10. 你们的项目组中所有的人都坐在一起么?
    需要。我反对Virtual Team,也反对Dev在美国、Test在中国这种开发方式。能坐在一起就最好坐在一起,好处多得不得了。

    11. 你们的进度表是否反映最新开发进展情况?
    应该反映。但是,应该用Baseline的方法来管理进度表:维护一份稳定的Schedule,再维护一份最新更改。Baseline的方法也应该用于其它的Spec。Baseline是变更管理里面的一个重要手段。

    12. 你们的工作量是先由每个人自己估算的么?
    应该让每个人自己估算。要从下而上估算工作量,而不是从上往下分派。除非有其他原因,比如政治任务工期固定等。

    13. 你们的开发人员从项目一开始就加班么?
    不要这样。不要一开始就搞疲劳战。从项目一开始就加班,只能说明项目进度不合理。当然,一些对日软件外包必须天天加班,那属于剥削的范畴。

    14. 你们的项目计划中Buffer Time是加在每个小任务后面的么?
    不要。Buffer Time加在每个小任务后面,很容易轻易的就被消耗掉。Buffer Time要整段的加在一个Milestone或者checkpoint前面。

    15. 值得再多花一些时间,从95%做到100%好
    值得,非常值得。尤其当项目后期人困马乏的时候,要坚持。这会给产品带来质的区别。

    16. 登记新缺陷时,是否写清了重现步骤?
    要。这属于Dev和Test之间的沟通手段。面对面沟通需要,详细填写Repro Steps也需要。

    17. 写新代码前会把已知缺陷解决么?
    要。每个人的缺陷不能超过10个或15个,否则必须先解决老的bug才能继续写新代码。

    18. 你们对缺陷的轻重缓急有事先的约定么?
    必须有定义。Severity要分1、2、3,约定好:蓝屏和Data Lost算Sev 1,Function Error算Sev 2,界面上的算Sev 3。但这种约定可以根据产品质量现状适当进行调整。

    19. 你们对意见不一的缺陷有三国会议么?
    必须要有。要有一个明确的决策过程。这类似于CCB (Change Control Board)的概念。

    20. 所有的缺陷都是由登记的人最后关闭的么?
    Bug应该由Opener关闭。Dev不能私自关闭Bug。

    21. 你们的程序员厌恶修改老的代码么?
    厌恶是正常的。解决方法是组织Code Review,单独留出时间来。XP也是一个方法。

    22. 你们项目组有Team Morale Activity么?
    每个月都要搞一次,吃饭、唱歌、Outing、打球、开卡丁车等等,一定要有。不要剩这些钱。

    23. 你们项目组有自己的Logo么?
    要有自己的Logo。至少应该有自己的Codename。

    24. 你们的员工有印有公司Logo的T-Shirt么?
    要有。能增强归属感。当然,T-Shirt要做的好看一些,最好用80支的棉来做。别没穿几次就破破烂烂的。

    25. 总经理至少每月参加次项目组会议
    要的。要让team member觉得高层关注这个项目。

    26. 你们是给每个Dev开一个分支么?
    反对。Branch的管理以及Merge的工作量太大,而且容易出错。

    27. 有人长期不Check-In代码么?
    不可以。对大部分项目来说,最多两三天就应该Check-In。

    28. 在Check-In代码时都填写注释了么?
    要写的,至少一两句话,比如“解决了Bug No.225”。如果往高处拔,这也算做“配置审计”的一部分。

    29. 有没有设定每天Check-In的最后期限?
    要的,要明确Check-In Deadline。否则会Build Break。

    30. 你们能把所有源码一下子编译成安装文件吗?
    要的。这是每日编译(Daily Build)的基础。而且必须要能够做成自动的。

    31. 你们的项目组做
  • [QUOTE]一、数据库连通性

    1、csharp_web_simplelogonengine.exe
    该 C# .NET web 程序实例示范了如何使用 ReportDocument 类的数据库表 (database table) 对象建立连接,以登录安全的 SQL 数据库。本程序适用于 Visual Studio .NET 内置的水晶报表 (Crystal Reports for Visual Studio .NET) 及其更新版本。
    http://support.crystaldecisions.com/communityCS/FilesAndUpdates/csharp_web_simplelogonengine.exe.asp

    2、csharp_web_simplelogonviewer.exe
    该 C# .NET web 程序实例示范了如何使用 CrystalReportViewer 控件的 LogonInfo 属性建立连接,以登录安全的数据库。本程序适用于 Visual Studio .NET 内置的水晶报表 (Crystal Reports for Visual Studio .NET) 及其更新版本。
    http://support.crystaldecisions.com/communityCS/FilesAndUpdates/csharp_web_simplelogonviewer.exe.asp

    3、csharp_win_dbengine.exe
    该 C# .NET Windows 程序实例示范了如何登录安全的 SQL 数据库。本程序适用于 Visual Studio .NET 内置的水晶报表 (Crystal Reports for Visual Studio .NET) 及其更新版本。
    http://support.crystaldecisions.com/communityCS/FilesAndUpdates/csharp_win_dbengine.exe.asp

    4、csharp_win_dbviewer.exe
    该 C# .NET Windows 程序实例示范了如何使用 Windows 窗体查看器 (Windows Form viewer) 对象模型将报表连接到安全的数据库。
    http://support.crystaldecisions.com/communityCS/FilesAndUpdates/csharp_win_dbviewer.exe.asp
    ----------------------------------

    二、ADO.NET
    1、csharp_web_adonet.exe
    该 C# .NET web 程序实例示范了如何在运行时构造和组装 ADO.NET 数据集,并将它传递给报表。本程序适用于 Visual Studio .NET 内置的水晶报表 (Crystal Reports for Visual Studio .NET) 及其更新版本。
    http://support.crystaldecisions.com/communityCS/FilesAndUpdates/csharp_web_adonet.exe.asp

    2、csharp_win_adodotnet.exe
    该 C# .NET Windows 程序实例示范了如何在运行时构造和组装 ADO.NET 数据集 (dataset),并将它传递给报表。
    http://support.crystaldecisions.com/communityCS/FilesAndUpdates/csharp_win_adodotnet.exe.asp
    ----------------------------------

    三、导出

    1、csharp_web_export.exe
    该 C# .NET web 程序实例示范了如何将报表导出成多种文件格式(比如:.DOC 或者 .XLS)。本程序适用于 Visual Studio .NET 内置的水晶报表 (Crystal Reports for Visual Studio .NET 2002) 及其更新版本。
    http://support.crystaldecisions.com/communityCS/FilesAndUpdates/csharp_web_export.exe.asp

    2、csharp_win_export.exe
    该 C# .NET Windows 程序实例示范了如何将你的报表导出成多种格式。本程序适用于 Visual Studio .NET 内置的水晶报表 (Crystal Reports for Visual Studio .NET) 及其更新版本。
    http://support.crystaldecisions.com/communityCS/FilesAndUpdates/csharp_win_export.exe.asp

    3、csharp_win_exporttopdf.exe
    该 C# .NET Windows 程序实例示范了如何将你的报表导出成便携文档格式 (Portable Document Format) (PDF)。本程序适用于 Visual Studio .NET 内置的水晶报表 (Crystal Reports for Visual Studio .NET) 及其更新版本。
    http://support.crystaldecisions.com/communityCS/FilesAndUpdates/csharp_win_exporttopdf.exe.asp
    ----------------------------------

    四、格式化

    1、csharp_win_sortfields.exe
    该 C# Windows 程序实例示范了如何在运行时改变报表的主排序字段 (Sort Field) 和字段排序方向 (Sort Field direction)。本程序适用于 Visual Studio .NET 内置的水晶报表 (Crystal Reports for Visual Studio .NET) 及其更新版本。
    http://support.crystaldecisions.com/communityCS/FilesAndUpdates/csharp_win_sortfields.exe.asp
    ----------------------------------

    五、公式

    1、csharp_win_dynamic_report_formula.exe
    该 C# .NET Windows 程序实例示范了如何根据用户输入创建动态报表。程序用空白公式字段指定那一个数据库字段出现在报表里,并指定分组所依据的字段。本程序适用于 Visual Studio .NET 内置的水晶报表 (Crystal Reports for Visual Studio .NET) 及其更新版本。
    http://support.crystaldecisions.com/communityCS/FilesAndUpdates/csharp_win_dynamic_report_formula.exe.asp
    ----------------------------------

    六、参数字段

    1、csharp_web_discreteparams.exe
    该 C# .NET web 程序实例示范了如何将多个数值传递给离散参数字段 (discrete parameter field)。本程序适用于 Visual Studio .NET 内置的水晶报表 (Crystal Reports for Visual