AutoCAD 3DMAX C语言 Pro/E UG JAVA编程 PHP编程 Maya动画 Matlab应用 Android
Photoshop Word Excel flash VB编程 VC编程 Coreldraw SolidWorks A Designer Unity3D
 首页 > VC编程

设计Microsoft Windows NT操作系统上的32位SQL Server 应用程序

51自学网 2015-08-30 http://www.51zixue.net

 

如果你希望使已有的基于Windows的DB-Library应用程序能够在Windows NT上运行,你可以采取三种方法:

·  将你的16位Windows 3.x应用程序不加改变的运行于Windows 3.x子系统. 如果你已有Windows 3.x应用程序,你完全不必甚至将来也不需要进行改动,只需要不加改变的运行即可。

·  更改你的应用程序源代码以便其能被编译用于Win32 API或Windows 3.x. 如果你的DB-Library应用程序正在开发或正在改进以满足不断改变的用户需要,以及你希望在Windows 3.x和Windows NT上运行应用程序,从相同的源代码略微进行改动以建立你的16位(Windows 3.x)版本和32位(Win32)版本的应用程序。

·  将你的应用程序源代码完全转换到Win32. 如果你决定更改你的应用程序只作为32位 (基于Win32)应用程序运行(例如,你需要诸如线程和抢先多任务(preemptive multitasking)等Win32特性),你可以将你的应用程序转换到Win32 API上,并删除冗余的Windows 3.x调用和依赖。

在保持DB-Library对Windows 3.x兼容基础上进行转换

本章节解释了如何将用于Windows 3.x的DB-Library应用程序转换到Windows NT操作系统,而同时保持与Windows 3.x应用程序的兼容性。

用于Windows 3.x和C运行时态的API调用

一般而言,你可以改变你的代码轻而易举地建立16位或32位版的应用程序。对于更深入的讨论编写使用Win32 API的且保留了与Windows 3.x兼容性的应用程序,请参阅Microsoft Win32 API Programmer’s Reference第1卷

下面是使用Win32 API的应用程序开发指导方针:

·  函数定义与原型.确保你的函数定义和函数原型使用了可转换的数据类型。

·  Windows 消息参数封装.处理扩宽到32位意味着处理的封装、其它wParam和lParam中的值已经改变。检验你是否需要改变你的应用程序中的wParam和lParam编码。

DB-Library函数和数据类型

所有的DB-Library函数都完全能在操作系统间转换。你只需要在编译的时候定义目标操作系统即可。

许多DB-Library函数的返回值为int型。要注意int数据类型在Windows 3.x中是16位值而在Win32 API中则是32位值。因此,对你的应用程序进行检查以使用正确的变量类型接收返回int数据类型的DB-Library函数所返回的值。例如,一个定义为short数据类型的变量在Windows 3.x中可以从DB-Library接收到正确的int值而在Win32 API中则接收到错误的值。

除了检验接收DB-Library的返回值的变量类型是正确的以外,不需要对DB-Library函数做任何改动。

转换的其它考虑

如果你要将Windows 3.x操作系统的一个应用程序转换到Windows NT操作系统上而不需要保持与Windows 3.x的兼容性,你可以改变你的DB-Library代码,删除冗余或不必要的Windows 3.x函数。

冗余的Windows 3.x专用DB-Library函数

下面的Windows 3.x专用的DB-Library函数在Win32版本的DB-Library是冗余的:

dbinit

在Win32 API中,不需要在引用其它DB-Library函数之前调用dbinit函数。与在MS-DOS®和OS/2®操作系统中的相同,对dbinit的Win32调用返回一个版本字符串。在Windows 3.x中,必须调用dbinit函数初始化DB-Library数据结构。

注意 通常推荐通过调用dbinit来得到DB-Library的版本字符串,并使其可被用户查看(例如,在“About”对话框中)。

dbwinexit

该函数在Win32中不需要。

DBLOCKLIB/DBUNLOCKLIB

在Win32中,每个进程拥有唯一的线性虚拟地址空间,其允许的最大寻址空间为4GB存储器(低端内存的2GB可被用户使用)。在效果上相当于所有的数据存在于一个大的段中,你可以不用关注段、长指针(far pointers)以及其它。这样,你不必在访问指向DB-Library DLL数据的指针或向DB-Library DLL传输数据的指针之前调用DBLOCKLIB和DBUNLOCKLIB宏。

对错误/消息处理器的注册的更改

下面是对Win32的错误和消息处理器的注册的改动:

·  不必输出回调(callback)函数. 你不需要在一个.DEF文件中输出DB-Library错误和消息处理器。

·  不必调用MakeProcInstance. 你不需要调用MakeProcInstance来得到一个传递到dberrhandle和 dbmsghandle的函数。只需要调用dberrhandle 和dbmsghandle,传递函数地址。下面的例程显示了在Windows 3.x和Win32中调用dberrhandle和dbmsghandle函数的不同方式:

对于Windows 3.x:

// Define variables

static FARPROC lpdbMsgHandler;

static FARPROC lpdbErrHandler;



// Get Procedure Instances

lpdbMsgHandler = MakeProcInstance((FARPROC)dbMsgHandler, hInst);

lpdbErrHandler = MakeProcInstance((FARPROC)dbErrHandler, hInst);



// Install the instances into dblib

dbmsghandle(lpdbMessageHandler);

dberrhandle(lpdbErrorHandler);

对于Win32:

// Install the instances into dblib

dbmsghandle(dbMessageHandler);

dberrhandle(dbErrorHandler);

抢先多任务(Win32)与协同多任务(Windows 3.x)

在Windows 3.x中,为了支持协同多任务环境下的同步处理,每个应用程序必须运行良好并按照正常间隔占用CPU。因此,当在Windows操作系统中处理SQL Server查询时,你需要使用基于Windows的定时器或PeekMessage函数与DB-Library函数结合以实现同步处理(dbsqlsend, dbdataready, and dbsqlok)。有关在Windows 3.x中实现同步查询的详细信息,请参阅Microsoft SQL Server Programmer’s Reference for C (43页)。

在Win32 API中对抢先多任务的支持简化了同步查询处理的实现过程。抢先多任务作为Windows NT固有的特性确保了无论其它应用程序的任何进程正在进行处理,另一个程序的进程总能得到CPU周期。在单处理器环境中,同步处理通过使用Win32线程或使用支持与PostMessage Windows函数协作实现同步处理的DB-Library函数而实现。有关同步处理的详细信息,请参阅本文后面的“在DB-Library应用程序中使用Win32 API的特性”内容。

转换SQLTEST3示例应用程序

本章节使用DB-Library Programmer’s Toolkit提供的示例应用程序SQLTEST3作为例子演示如何将一个DB-Library应用程序从Windows 3.x转换到Windows NT。虽然使用的是一个简单的应用程序,但本例能够显示从Windows 3.x操作系统转换应用程序到Windows NT操作系统是多么的容易。

向Win32的最小转换(保持与Windows 3.x的兼容性)

下面的过程显示了如何更改SQLTEST3示例程序以将其转换到Win32 API而同时保持与Windows 3.x的兼容性:

更改操作系统定义:
更改(Windows 3.x):

#define DBMSWIN

到(Win32):

#define DBNTWIN32

改变SQLTEST3.H中的函数原型使其可转换:
更改(Windows 3.x):

long FAR PASCAL SqlTestWndProc(HWND, unsigned, WORD, LONG);

BOOL FAR PASCAL AboutSQL(HWND, unsigned, WORD, LONG);

BOOL FAR PASCAL SelectSQL(HWND, unsigned, WORD, LONG);

BOOL FAR PASCAL ConnectSQL(HWND, unsigned, WORD, LONG);

int dbwinErrorHandler(DBPROCESS *, int, int, int, LPSTR, LPSTR);

int dbwinMessageHandler(DBPROCESS *,DBINT,DBSMALLINT,DBSMALLINT,LPSTR);

到(Win32):

LONG APIENTRY SqlTestWndProc(HWND, UINT, DWORD, LONG);

LONG APIENTRY AboutSQL(HWND, UINT, DWORD, LONG);

LONG APIENTRY SelectSQL(HWND, UINT, DWORD, LONG);

LONG APIENTRY ConnectSQL(HWND, UINT, DWORD, LONG);

int API dbwinErrorHandler(DBPROCESS *, int, int, int, LPSTR, LPSTR);

int API dbwinMessageHandler(DBPROCESS* DBINTDBSMALLINT, DBSMALLINT, LPSTR);

 
 
说明
:本教程来源互联网或网友上传或出版商,仅为学习研究或媒体推广,51zixue.net不保证资料的完整性。

上一篇:MD5算法研究  下一篇:如何在C/C++中调用Java