VC下如何操作DBF(FoxPro数据库)文件?

fupinger 2005-07-29 04:20:54
如题,可以再加分。
...全文
752 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiangrujian 2006-06-20
  • 打赏
  • 举报
回复
关注!帮顶!
yzxandfcm 2006-06-20
  • 打赏
  • 举报
回复
学习,关注中!
yzxandfcm 2006-06-20
  • 打赏
  • 举报
回复
用ADO以数据库方式打开DBF,JET 4.0
yzxandfcm 2006-06-20
  • 打赏
  • 举报
回复
用ADO以数据库方式打开DBF,JET 4.0
grayloach1 2005-09-15
  • 打赏
  • 举报
回复
收藏
AntonlioX 2005-07-30
  • 打赏
  • 举报
回复
我们在用VC++进行基于数据的综合开发时,会经常访问到大量的物理存储位置不可预见的FoxPro数据表(.DBF文件)。 这时,我们就要使用到动态加载ODBC的技术去访问这些数据表。   ■技术要点分析   使用ODBC技术时,要求程序开发人员能预先确定数据源的位置,利用“控制面板”中的“ODBC管理器”手工加载数据库。 但在实际的开发中,特别是基于Client/Server网络环境的综合开发中,往往无法确定数据源的位置,而只能进行动态加载。 对于这种情况,我们可以使用一个Windows API函数 SQLConfigDataSource( )来完成这一操作。   ■应用举例   先用FoxPro生成一张数据表Member.dbf,并设计好各项字段。注意字段名用英文,否则在VC++中使用时会出现错误。   接着利用Visulal C++ 的向导生成一个基于对话框的程序,命名为DBFDemo。修改主对话框,如图所示。 利用ClassWizard为程序加入一个基类为CRecordset的名为CUserInfo的新类,按照向导的指示,取得Member.dbf的表结构。 在类CUserInfo的头文件上加入两个文件包含语句:   #include "afxdb.h"   #include "odbcinst.h"   下面给出范例程序的关键代码:   BOOL CDBFDemoDlg::OnInitDialog()   //主对话框的初始化函数   {    ……//省略部分机器生成代码    //下面一句开始动态增加一个ODBC驱动   SQLConfigDataSource(NULL,ODBC_ADD_DSN,"Microsoft Visual FoxPro Driver",    "DSN=UserInfo\0Description=UserInfo\   0SourceType=dbf\0Source=d:\\DBF\0");   Database.Open(_T("UserInfo"));   //打开ODBC驱动,Database派生于CDatabase类   UserInfo.m_pDatabase=&&Database;   //设置与CDatabase的连接,UserInfo派生于CUserInfo类   UserInfo.Open(AFX_DB_USE_DEFAULT_TYPE, "SELECT  FROM member",CRecordset::none);   return TRUE;   }   void CDBFDemoDlg::GetRecordValue()   {   //这个函数取得打开的表中的记录,并利用DDX/DDV机制相应设置对话框中的各控件    m_Order=UserInfo.m_order;   //取得记录中各字段的值,并设置相应的控件值    m_Name=UserInfo.m_name;    m_Age=UserInfo.m_age;    m_Addr=UserInfo.m_addr;    if(UserInfo.m_sex==TRUE)   //典型的设置记录中类型为BOOL型的字段的操作   this-〉CheckRadioButton(IDB_MAN,IDB_WOMAN,IDB_MAN);    else this-〉CheckRadioButton(IDB_MAN,IDB_WOMAN,IDB_WOMAN);    UpdateData(FALSE);   //将记录信息显示在对话框中   }   void CDBFDemoDlg::OnNext()   //按钮“下一个”的响应函数   {   if(!UserInfo.IsEOF())   //测试记录是否到底部    {   UserInfo.MoveNext();   //向下移动一个记录   GetRecordValue();   //设置对话框中的记录显示    } else    {   //报告到达最末记录信息   ::MessageBox(this-〉m_hWnd,"到达最末记录","消息框",MB_OK);   UserInfo.MovePrev();   //若到最末记录,上移一个记录,避免空操作    }   }   void CDBFDemoDlg::OnPrev()   //按钮“下一个”的响应函数   {   if(!UserInfo.IsBOF())   //测试记录是否到达顶部    {   UserInfo.MovePrev();   //向上移动一个记录   GetRecordValue();   //设置对话框中的记录显示    } else    { //报告到达首记录   ::MessageBox(this-〉m_hWnd,"到达首记录","消息框",MB_OK);   UserInfo.MoveNext();    }   }   void CDBFDemoDlg::SetRecordValue()   {//这个函数根据对话框中各控件的值设置数据表中的某个记录的各字段值    UpdateData(TRUE);   //利用DDX/DDV机制取得控件中的值    UserInfo.m_order=m_Order;    UserInfo.m_name=m_Name;    UserInfo.m_addr=m_Addr;    UserInfo.m_sex=Sex;   //变量Sex可以取得“性别”一项中所选的值    UserInfo.m_age=m_Age;    UserInfo.Update(); //更新记录的值   }   void CDBFDemoDlg::OnApply()   //按钮“应用”的响应函数   { //这个函数可以进行用户所选择的如“新增用户”、“修改用户”、“删除用户”的操作    switch(Operator) //变量Operator的值由用户的选择而决定    {    case ADD:   //宏“ADD”已经在程序开头时进行了定义    if(UserInfo.CanAppend()==TRUE)   UserInfo.AddNew(); //新增用户   SetRecordValue();    this-〉OnAdd();    break;    case MODI: //修改用户信息    UserInfo.Edit();   SetRecordValue();    break;    case DELE: //删除用户    if(UserInfo.IsDeleted()==FALSE)    {    UserInfo.Delete();    this-〉OnPrev();    }    break;    default: //用户没有进行操作选择   ::MessageBox(this-〉m_hWnd,"请选择你所要进行的操作","忘记选择操作",MB_OK);    break;    }   }   限于篇幅,笔者只列出其主要代码,读者可以根据这些关键代码完成这个范例程序。   程序在中/英文Windows 98、VC++ 6.0环境下编译通过,运行正常。需要注意的是, 由于范例中使用的是Visual FoxPro 6.0的ODBC驱动器,所以要试验这个程序,请先安装VFP 6.0。
oyljerry 2005-07-30
  • 打赏
  • 举报
回复
//*************************************************************
// DBF读写类库跨平台版本,在windows、linux、Sco下编译通过。
// 修改:袁斌
// oldworm@21cn.com
// http://yb.nos.com.cn/index.html
// 时间:2000年4月11日
// bug report: 内部->yb@compagis.com
// 外部->oldworm@21cn.com
//
// 主要修改内容:
// 一、速度方面的修改。
// 1、将原先通过多个sprintf、sscanf等写一条记录的方式改为
// 通过调用xntoy系列函数取代,速度提高不少。
// 2、将原先采用单链表方式组织的字段结构改成hash链表方式,
// 查找字段基本上为常数级别O(1),速度有一定提高。
//
// 二、安全性方面的修改。
// 1、使用snprintf取代以前的sprintf。
// 2、使用xntoy系列函数保证缓冲区不越界。
//
// 三、移植性方面的修改。
// 1、将全部_???函数换成???函数。
// 2、将全部_???参数换成???参数。
// 3、针对Linux下面没有的几个函数在xntoy里面作了实现。
//
// 四、其它修改内容。
// 1、将函数位置进行了调整,相同功能部分放在了一起。
// 2、将函数名称进行了调整,基本上采用ODBC一致的名称。
// 3、将有副作用的Append函数和读字段值函数进行了调整。
// 4、对相关数据结构进行了调整。
// 5、对一次读写多条记录的函数及相关内容全部删除。
//*************************************************************
oyljerry 2005-07-30
  • 打赏
  • 举报
回复
ifndef __YB_DEFINE_DBF_H__
#define __YB_DEFINE_DBF_H__

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <time.h>
#include <string.h>

#ifdef WIN32
#include <sys\stat.h>
#include <sys\types.h>
#include <sys\locking.h>
#include <share.h>
#include <dos.h>
#include <io.h>
#define snprintf _snprintf
#else
#include <sys/stat.h>
#include <unistd.h>
#include "xntoy.h"
#define O_BINARY 0
#endif

//*************************************************************
// DBF读写类库跨平台版本,在windows、linux、Sco下编译通过。
// 修改:袁斌
// oldworm@21cn.com
// http://yb.nos.com.cn/index.html
// 时间:2000年4月11日
// bug report: 内部->yb@compagis.com
// 外部->oldworm@21cn.com
//
// 主要修改内容:
// 一、速度方面的修改。
// 1、将原先通过多个sprintf、sscanf等写一条记录的方式改为
// 通过调用xntoy系列函数取代,速度提高不少。
// 2、将原先采用单链表方式组织的字段结构改成hash链表方式,
// 查找字段基本上为常数级别O(1),速度有一定提高。
//
// 二、安全性方面的修改。
// 1、使用snprintf取代以前的sprintf。
// 2、使用xntoy系列函数保证缓冲区不越界。
//
// 三、移植性方面的修改。
// 1、将全部_???函数换成???函数。
// 2、将全部_???参数换成???参数。
// 3、针对Linux下面没有的几个函数在xntoy里面作了实现。
//
// 四、其它修改内容。
// 1、将函数位置进行了调整,相同功能部分放在了一起。
// 2、将函数名称进行了调整,基本上采用ODBC一致的名称。
// 3、将有副作用的Append函数和读字段值函数进行了调整。
// 4、对相关数据结构进行了调整。
// 5、对一次读写多条记录的函数及相关内容全部删除。
//*************************************************************

#define max(a,b) ((a<b) ? b : a)
#define min(a,b) ((a<b) ? a : b)

#pragma comment(exestr, "yb/oldworm cross platform dbf class 2000/04/11 ")

char * formatstr(char *s);
char * Trim(char *str);

typedef long BOOL;
typedef unsigned short ushort;
typedef unsigned int uint;
typedef unsigned char uchar;
typedef unsigned long ulong;

enum
{
MAX_FIELDS = 256
};

enum
{
FALSE = 0,
TRUE = 1
};

enum
{
RDONLY = 0x01, // 只读流览
RDWR = 0x02 // 可读写流览
};

enum
{
EQUAL = 1,
GREATER = 2,
GREATER_OR_EQUAL= 3,
LESS = 4,
LESS_OR_EQUAL = 5
};

struct _dosdate_t
{
uint year;
uint month;
uint day;
};

typedef struct
{
uchar dbf_id; // dbf_id=03, memo field does not exist
// dbf_id=83, memo field exists( foxbase )
// dbf_id=F5, memo field exists ( foxpro )
char last_update[3]; // year,month,date of the file last_update
long last_rec; // serial number of the last record
ushort data_offset; // the start address of the data item
ushort rec_size; // the record size = all fields size + 1
char filler[20]; // unused
} DBF_HEAD;


typedef struct
{
char field_name[11];
char field_type;
char dummy[4]; // unused
union
{
ushort wlen; // when the field type is not numeric
struct
{
uchar len;
uchar dec;
}N; // when the field type is numeric
} linfo;
char filler[14]; // unused
}FIELD_REC;


typedef struct FIELD_LIST
{
FIELD_REC field_rec; //字段内容
char *cname; //该字段对应的中文名称
int m_start; //
}FIELD_LIST;


typedef struct FIELD_HASHNODE FIELD_HASHNODE;

struct FIELD_HASHNODE
{
ushort index;
FIELD_HASHNODE *next;
};


typedef struct
{
int handle; //Dbf文件句柄
char * file_name; //
long curr_rec; //当前记录
DBF_HEAD dbf_head; //文件头部
FIELD_LIST * field_list[MAX_FIELDS];
FIELD_HASHNODE *field_hashnode[MAX_FIELDS];
ushort field_num; //字段数目
char *record_buf; //记录缓冲
}DBF_HANDLE;


typedef class Dbf DBF;
typedef class Dbf DBFFILE;


class Dbf
{
public :
DBF_HANDLE * dbf_handle;

Dbf();
~Dbf();
public:
/**************************************************************************
功 能: 打开一数据文件
传入参数: filename ---- 文件名
fptFilename ---- 备注文件名, 缺省为库文件+FPT后缀
返 回: TRUE -- 成功 FALSE -- 失败
***************************************************************************/
BOOL Open(const char * filename,char openway=RDWR );
//关闭数据库文件。
void Close(void );
// 根据指定字段列表创建DBF库
BOOL Create(const char * filename, FIELD_REC * field );
// 删除DBF库中的全部记录,仅保留字段和数据库头部。
BOOL Zap( void );
public:
////////////////////////////////////////////////////////////////////////
//field function
static void AddField(FIELD_REC &field_rec,const char *fieldname,
char fieldtype,ushort len,uchar dec=0);
void SetFieldCName( char * field_name , char * fieldChName ) ;
BOOL GetFieldName(char *sa[], int item_size, int item_num); //取全部字段名称列表。
FIELD_LIST * look_field(const char *field_name);
////////////////////////////////////////////////////////////////////////
//cursor function
BOOL Move( long rec_num ); // 把当前记录指针移到指定记录号, 并读取内容
BOOL MoveFirst( void ); // 把当前记录指针移到第一条记录, 并读取内容
BOOL MoveNext( long rec_num = 1L ) ; // 把当前记录指针移到下一条记录,并读取记录内容
BOOL MoveLast( void );
//record function
long RecNo() ; // 返回当前记录号
long GetRecordCount( ); // 返回当前记录数
long ReadRecordCount( void ) ; // 重读文件,获取当前记录数
void ClearRecBuf( void ) ; // 清记录内存缓冲
char *RecordBuf( void ); // 返回当前记录缓冲指针
//Lock Function
void SetLock ( void ){ lock = 1; };
void SetUnLock( void ){ lock = 0; };
////////////////////////////////////////////////////////////////////////
BOOL Append(const char *id_fname=NULL); // 追加记录
BOOL Update(long rec_num = 0L); //用当前记录缓冲内容修改指定记录, 0表示修改当前记录
BOOL AppendBlank(void); //追加一条空记录
BOOL Delete(long rec_num =0) ; //设置删除标志。rec_num = 0 表示当前记录。
BOOL IsDelete( void ); //判断当前记录是否有删除标记
char *FileName( void ) //返回当前数据库名
{
if( dbf_handle != NULL )
return (dbf_handle->file_name) ;
else
return "\0" ;
}

BOOL IsOpen()
{//测试是否 DBF FILE 已经正常打开。
return ( dbf_handle!=NULL && dbf_handle->handle!=-1 );
}
public:
////////////////////////////////////////////////////////////////////////
//以下函数取指定字段的值
char * GetFieldValue (const char *field_name, char *fieldvalue, int size,
BOOL bFormat=TRUE,char * field_type=NULL);
BOOL GetFieldValue(const char *field_name, long &value);
BOOL GetFieldValue(const char *field_name, int &value);
BOOL GetFieldValue(const char *field_name, short &value);
BOOL GetFieldValue(const char *field_name, float &value);
BOOL GetFieldValue(const char *field_name, double &value);
////////////////////////////////////////////////////////////////////////
// 修改指定字段的内容
BOOL SetFieldValue(const char * field_name , const char * field_value );
BOOL SetFieldValue(const char * field_name , long field_value );
BOOL SetFieldValue(const char * field_name , int field_value );
BOOL SetFieldValue(const char * field_name , short field_value );
BOOL SetFieldValue(const char * field_name , float field_value );
BOOL SetFieldValue(const char * field_name , double field_value );
private:
inline BOOL insert_field_hashnode(FIELD_HASHNODE *pnode);
inline BOOL _SetFieldValue(FIELD_LIST *flist_ptr , const char * field_value);
inline BOOL _Update(long rec_num = 0L, int size=0);
inline void _SetDosDate(DBF_HEAD *phead);
inline short FieldLen( FIELD_LIST * flist_ptr ) ;
int read_dbfhead( void );
BOOL lock_dbf_rec( long rec, long RecNum );
BOOL unlock_dbf_rec( long rec, long RecNum );
BOOL lock_dbf_file( void );
BOOL unlock_dbf_file( void );
BOOL lock_dbf_head( void );
BOOL unlock_dbf_head( void );
BOOL LockFile( long offset, long rec_size );
BOOL UnlockFile( long offset, long rec_size );

private:
int open_way; //文件
老夏Max 2005-07-29
  • 打赏
  • 举报
回复
http://www.csdn.net/cnshare/soft/15/15429.shtm
老夏Max 2005-07-29
  • 打赏
  • 举报
回复
http://www.vchelp.net/vchelp/archive.asp?type_id=50&class_id=1&cata_id=10&article_id=786&search_term=
bohut 2005-07-29
  • 打赏
  • 举报
回复
参考:
http://sanjianxia.diy.myrice.com/vc/vc1.htm
skymartin 2005-07-29
  • 打赏
  • 举报
回复
先用SqlConfigDataSource函数建立一个FoxPro文件想对应的文件数据源, 然后通过这个ODBC数据源对文件访问.
用CDataBase + CRecordset + sql语句就可以了, 想怎么访问就怎么访问.
加密狗系列—软件狗 面向单机环境的低成本加密方案   软件狗是使用在计算机并行口和USB口上的用于软件保护的硬件产品。软件狗采用端口噪声技术,提供100字节的掉电保护存储器,具备反跟踪能力,是经济实用软件保护解决方案的首选。软件狗开发套件有两种选型:并口型和USB型。软件开发商可以采用多种方法保护软件,防止软件被非法拷贝使用。软件狗开发套件由:软件狗、加密接口、开发商工具等组成。 1.软件狗 软件狗指安装在并口上或 USB 口上的硬件狗。软件狗是一个可编程、可读写的存储设备,具有 100 个字节的数据存储区。如果软件狗插在计算机上,您可以通过相应的加密接口函数或开发商工具对软件狗进行访问。 2.加密接口 软件狗开发套件提供的加密接口是一套包含各种开发语言的程序接口模块,可以嵌在程序的源代码中。您可以在您程序中使用软件狗开发套件提供的加密接口对软件狗进行操作。 3.开发商工具(DogEdt32.EXE) 软件狗开发商工具可以使开发商方便地对软件狗存储区进行编辑、读取系列号以及连续初始化等操作。 工作原理: 开发商程序通过调用软件狗开发套件提供的接口模块对软件狗操作,软件狗响应该操作并通过接口模块将相应数据返回给开发商程序。开发商程序可以对返回值进行判定并采取相应的动作。如果返回无效的响应,表明没有正确的软件狗,开发商可以将应用程序终止运行。 简要示意如下: 软件狗开发套件提供了两种加密方案:使用 Obj 、 DLL 、 ActiveX 控件或者直接使用外壳工具,请根据您的需求选择方案。 加密方案一:使用 Obj 、 DLL 、 ActiveX 控件 Obj 、 DLL 、 ActiveX 控件提供了操作软件狗的接口函数,您可以直接在应用程序的源代码里加入这些接口函数的调用,来保护您的一个或者多个软件,然后重新编译您的应用程序。 由您来设置应用程序中调用加密接口的次数以及没有发现软件狗采取的措施。原则上您调用、设置的加密接口越多将更有利于阻止潜在破坏您的软件保护。 加密方案二:使用外壳工具 使用外壳工具对软件保护是一种快速、简单的保护方案。它不象使用接口函数需要对源代码进行改动,而是自动给您的可执行应用程序加了一个保护层。在程序开始运行和运行当中会自动地访问软件狗是否存在。假如软件狗不存在,用户将看到一个错误提示,该应用程序将不能运行。 产品特点: 软件狗开发套件适用于 DOS 、 Windows 3X/9X/ME/NT/2000/XP 、 Linux 操作系统,支持几乎所有主流编程语言、开发工具。软件狗的主要特点如下: 数据交换随机噪声技术 有效地对抗逻辑分析仪及各种调试工具的攻击,完全禁止软件仿真程序模拟并口的数据。 迷宫技术 在 RC-DL 函数入口和出口之间包含大量复杂的判断跳转干扰代码,动态改变执行次序,提升 RC-DL 的抗跟踪能力。 时间闸 硬件狗内部设有时间闸,各种操作必须在规定的时间内完成。硬件狗正常操作用时很短,但跟踪时用时较长,超过规定时间,硬件狗将返回错误结果。 AS 技术 API 函数调用与 SHELL 外壳加密相结合的方式,同时使用能够达到极高的加密强度。 RC-DL 开发套件在外壳加密工具中与调用的 API 函数建立了对应关系。这样处理后,程序中调用的 API 函数只有在有外壳的情况下才能正确运行,而外壳本身隐蔽了对 API 函数的调用。 抗共享 可以通过编程的方式实现对抗并口共享器。 存储器 提供 100 字节掉电保持数据存储区供开发商存放关键数据、配置参数等信息,可通过 RC-DL 开发商工具或接口函数对存储区进行读写。 改良的硬件驱动程序 驱动程序的安装及发布更加方便、快捷,开发商只需使用 InstDrv.exe 安装驱动程序,硬件即可正常工作。 崭新的硬件狗编辑工具 DogEdt32.exe 集成了原有 DogEdt32.exe 、 Reveal.exe 、 Convert.exe 三个工具,并新增错误码查询功能,令硬件狗编辑调试过程更趋简捷、顺畅。 高强度动态库加密方式 在原有加密方式基础上,新增 C 语言高强度动态库加密方式,并有效运用动态库认证安全机制,确保动态库调用具有无与伦比的安全可靠性。 支持 ActiveX 控件 开发商可以在网页中或 VB 、 VC 中使用 ActiveX 控件对硬件狗进行操作。 Linux 模块 提供了针对 Linux 内核 2.2 和 2.4 版本驱动程序,开发商可以使用 Linux 模块保护运行于 Linux 操作系统上的应用程序。 新增功能: 软件狗开发套件 3.0 版新增功能在软件狗开发套件 V3.0 中,新增了与原并口硬件完全兼容的 UDA 型 USB 软件狗。 USB 软件狗也提供了 100 字节的用户存储区。新的开发商工具( DogEdt32.EXE )或接口函数既可以老的并口硬件,也可以对新的 USB 硬件进行操作。 已安装了软件狗开发套件 V2.1 的老用户如要使用 UDA 型 USB 软件狗,必须重新安装软件狗开发套件 V3.0 ,以安装 UDA 型 USB 软件狗的驱动程序并更新开发套件的 OBJ 。 开发商如果使用 WIN32 模块,在 Windows98 或更高版本( WindowsME/2K/XP )下既可以使用 USB 软件狗也可以使用并口软件狗。目前暂不提供 USB 软件狗在 Windows NT4 上的驱动程序,即在 Windows NT4 操作系统上,目前只能使用并口软件狗。 在安装 Linux2.4 以上内核的 Linux 系统中,既可以使用并口软件狗也可以使用 USB 软件狗。 WIN16 、 DOS16 、 DOS32 模块本次没有改动,仍只支持并口软件狗。 软件狗开发套件 目前最新版本为 v3.0 支持并口硬件 RC-DL (现已更名为 PDL ) , 支持 USB 口硬件 UDA 适用语言环境: 并口型软件狗: DOS16: C , C++, FORTRAN, ASM, Pascal, BASIC ( BASCOM, Quick,True, Turbo ) , FOXPRO, Clipper, Foxbase, Dbase, EXE/COM 文件;DOS32: C, C++ ( High, NDP, Watcom ), FORTRAN ( NDP, PowerStation,Watcom) , EXP 文件; Win16: C, C++ ( Borland, Visual ), Visual BASIC, FOXPRO, PowerBuilder,Delphi Win32: C, C++ ( Visual, Borland, C++Builder, MFC ), FORTRAN ( LAHEY,PowerStation, Visual ), Java, VisualBasic, VisualFoxpro, PowerBuilder,Delphi,JavaScript, VBScript, VBA, InstallShield, AutoCAD, .NET 等。 Linux: C, C++, Java USB 型软件狗: Win32: C, C++ ( Visual, Borland, C++Builder, MFC), FORTRAN ( LAHEY, PowerStation, Visual ), Java, VisualBasic, VisualFoxpro, PowerBuilder, Delphi , JavaScript, VBScript, VBA, InstallShield, AutoCAD, .NET 等等。 Linux: C, C++, Java 适用操作系统: 并口型软件狗: DOS , Windows 3.x / 9x / ME / NT / 2000 / XP / Sever 2003 LINUX (Red hat 内核 2.2 / 2.4) USB 型软件狗: Windows 98 / ME / 2000 / XP / Sever 2003 LINUX (Red hat 内核 2.2 / 2.4) 开发商升级注意事项: 并口 RC-DL (现已更名为 PDL )型软件狗的软件软件狗开发套件 V3.0 与原 DJ/DK 完全兼容,即使用软件狗开发套件 V3.0 的驱动程序、模块及工具,可以正常操作 DJ/DK 型软件狗。所以建议使用原 DJ/DK 软件的开发商将您的驱动程序、模块及工具全部用软件狗开发套件 V3.0 (光盘版)套件升级。 如果您仍旧使用原有的 DI/DJ/DK 驱动程序、模块及工具,在 DOS 、 Windows 9X/NT/2000 下对 RC-DL 只能做读操作,写操作将失败。如果您不想改动已发行的软件,而还要使用 RC-DL 型软件狗,只升级驱动程序也可以,但您的程序必须是 WIN32 程序。如果您加密的程序是 DOS16 、 DOS32 或 WIN16 程序,您必须升级新的模块及工具,否则将无法对 RC-DL 型软件狗进行写操作。 使用方法: 1.对 EXE 文件 ( 或 COM 文件 ), 利用配套软件中的 EXE 文件加密工具加密。 2 对数据库文件 (PRC 、 FOX 、 APP 、 DBF), 利用配套软件中的加密工具加密。 3 对于 C 语言及其它编译型语言,配套软件中提供可链接的模块文件 (OBJ 文件 ) , 模块文件中提供两个函数 :(1) 写数据 ; ⑵读数据。开发商可在要加密软件的源码中加入适当的调用语句,对软件狗进行读写操作,以确定对应的软件狗是否存在,从而决定程序是否继续运行。对加入软件狗函数调用的源程序编译后,链接时加上软件狗的模块文件 (OBJ) 即可。

4,011

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 数据库
社区管理员
  • 数据库
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧