VFP 幫助中的FLL資料_第1頁(yè)
VFP 幫助中的FLL資料_第2頁(yè)
VFP 幫助中的FLL資料_第3頁(yè)
VFP 幫助中的FLL資料_第4頁(yè)
VFP 幫助中的FLL資料_第5頁(yè)
已閱讀5頁(yè),還剩10頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、.一、將參數(shù)傳遞到 Visual FoxPro API 函數(shù)1二、如何從 ActiveX 控件和 FLL 庫(kù)返回值2三、外部庫(kù)的參數(shù)4四、創(chuàng)建 Visual FoxPro 動(dòng)態(tài)鏈接庫(kù)8五、訪問 Visual FoxPro 的變量和字段10六、用 Visual FoxPro API 管理內(nèi)存11七、如何管理內(nèi)存12八、FoxInfo 結(jié)構(gòu)13一、將參數(shù)傳遞到 Visual FoxPro API 函數(shù)Visual FoxPro API 例程常常需要特定 Visual FoxPro 數(shù)據(jù)結(jié)構(gòu)的參數(shù)。下列部分提供了 Visual FoxPro 數(shù)據(jù)類型和附加數(shù)據(jù)結(jié)構(gòu)的列表。有關(guān)實(shí)際的類型定義和結(jié)構(gòu)定義

2、,參考 Pro_ext.h 文件。Visual FoxPro API 數(shù)據(jù)類型下列數(shù)據(jù)類型可用于 Visual FoxPro API 例程。數(shù)據(jù)類型說明EDLINE編輯窗口中打開文件中的行號(hào)。第一行是 1。EDPOS編輯窗口中打開文件中字符的偏移位置。該文件或備注文件中第一個(gè)字符的偏移位置是 0。FCHAN文件通道。每個(gè)由 Visual FoxPro 或使用 _FCreate( ) 和 _FOpen( ) 通過 API 打開的文件都被指派一個(gè) FCHAN。FPFI指向返回整數(shù)值函數(shù)的 32 位指針。ITEMID指派給菜單上單個(gè)命令的唯一標(biāo)識(shí)符。MENUID指派給菜單的唯一標(biāo)識(shí)符。MHANDLE

3、給予每個(gè)由 Visual FoxPro 或使用 _AllocHand( ) 通過 API 分配的內(nèi)存塊的唯一標(biāo)識(shí)符。可以使用 _HandToPtr( ) 放棄對(duì)指針的引用。 NTI命名表索引。每個(gè)變量和表字段名都擁有該表中的一項(xiàng)。WHANDLE窗口句柄。指派給由 Visual FoxPro 或使用 _WOpen( ) 通過 API 打開窗口的唯一標(biāo)識(shí)符。 注意:由于 FAR 指針不適合于 32 位編譯器,Pro_ext.h 中的 #define 語(yǔ)句將 FAR、_far 和 _far 重新定義為 null 值。Visual FoxPro API 數(shù)據(jù)結(jié)構(gòu)下表列示了 Visual FoxPro

4、API 庫(kù)中使用的主要數(shù)據(jù)結(jié)構(gòu)。結(jié)構(gòu)說明EventRec用于描述給定時(shí)間上系統(tǒng)正在進(jìn)行什么操作的結(jié)構(gòu)。FoxInfo用于 FLL 庫(kù)中 Visual FoxPro 和程序間的通訊,不能用于 .ocx 文件。FoxTable用于 FLL 庫(kù)中 Visual FoxPro 和程序間的通訊,不能用于 .ocx 文件。Locator用于訪問參數(shù)值(FLL)或 Visual FoxPro 變量或字段(FLL 和 ocx)的結(jié)構(gòu)。ParamBlk用于 FLL 庫(kù)中 Visual FoxPro 和程序間的通訊,不能用于 .ocx 文件。Parameter用于 FLL 庫(kù)中 Visual FoxPro 和程序

5、間的通訊,不能用于 .ocx 文件。Point定義屏幕上單個(gè)點(diǎn)的水平和垂直坐標(biāo)的結(jié)構(gòu)。以行和列指定坐標(biāo)。Rect定義屏幕上矩形坐標(biāo)的結(jié)構(gòu)。矩形的左上角坐標(biāo)由(top,left)定義,而右下角由 (bottom-1,right-1)定義。以行和列指定坐標(biāo)。Value用于訪問參數(shù)值(FLL)或 Visual FoxPro 變量或字段 (FLL 和 OCX)的結(jié)構(gòu)。二、如何從 ActiveX 控件和 FLL 庫(kù)返回值可以將值從 ActiveX 控件或 Visual FoxPro 動(dòng)態(tài)連接庫(kù)(FLL) 中返回到 Visual FoxPro。要將值從 ActiveX 控件返回到 Visual FoxPr

6、o在該控件中使用 RETURN 語(yǔ)句并傳遞單個(gè)值。下列示例使用 RETURN 語(yǔ)句返回存儲(chǔ)在 VERSION 中的版本號(hào):復(fù)制代碼#define VERSION 101/ 此處是其他代碼long CPyCtrl:GetVersion() / 在變量 fVersion 中設(shè)置版本號(hào) return VERSION;從 FLL 庫(kù)中返回值當(dāng)要從 FLL 庫(kù)中返回值時(shí),請(qǐng)使用 API 函數(shù),而不是 C 或 C+ 本身的命令。注意:當(dāng)從 ActiveX 控件 (.ocx) 文件中返回值時(shí),不要使用 API 函數(shù)從該 FLL 庫(kù)中返回值,而使用 RETURN 語(yǔ)句。要從 FLL 庫(kù)中返回值使用下表所列示的

7、 API 函數(shù)。下列 API 函數(shù)只能用于 FLL 庫(kù)。函數(shù)說明_RetChar(char *string)設(shè)置函數(shù)返回值為 NULL 結(jié)尾的串。_RetCurrency(CCY cval, int width)設(shè)置函數(shù)返回值為貨幣值。_RetDateStr(char *string)設(shè)置函數(shù)返回值為日期。該日期以 mm/dd/yyyy 格式指定。_RetDateTimeStr(char *string)設(shè)置函數(shù)返回值為以 mm/dd/yyyy hh:mm:ss 格式指定的日期和時(shí)間。_RetFloat(double flt, int width, int dec)設(shè)置函數(shù)返回值為為浮點(diǎn)值。_

8、RetInt(long ival, int width)設(shè)置函數(shù)返回值為數(shù)字值。_RetLogical(int flag)設(shè)置函數(shù)返回值為邏輯值。零被當(dāng)作假(FALSE)。任何非零值都被當(dāng)作真(TRUE)。_RetVal(Value *val)傳遞完整的 Visual FoxPro Value 結(jié)構(gòu),可以返回除備注型以外的任何 Visual FoxPro 數(shù)據(jù)類型。必須調(diào)用 _RetVal( ) 來返回包含內(nèi)置 null 字符的串或 .NULL. 值。注意:要返回對(duì)象數(shù)據(jù)類型的值,請(qǐng)使用 _RetVal() 函數(shù)填充 Value 結(jié)構(gòu)的 ev_object 字段。下面示例,Sum 接收了對(duì)表中

9、數(shù)值型字段的引用并使用 _RetFloat 返回了該字段值的和:復(fù)制代碼#include Sum(ParamBlk *parm)/ 聲明變量double tot = 0, rec_cnt;int i = 0, workarea = -1; / -1 是當(dāng)前工作區(qū)Value val;/ GO TOP 到表頭_DBRewind(workarea);/ Get RECCOUNT( ) 獲取記錄數(shù)rec_cnt = _DBRecCount(workarea);/ 循環(huán)遍歷表for(i = 0; i p0.loc, &val); / 將該值添加到累計(jì)總數(shù) tot += val.ev_real; / SK

10、IP 1 在工作區(qū)中下跳一條記錄 _DBSkip(workarea, 1); / 將總數(shù)值返回到 Visual FoxPro_RetFloat(tot, 10, 4); / Sum 函數(shù)獲得一個(gè)引用參數(shù)FoxInfo myFoxInfo = SUM, Sum, 1,R ;FoxTable _FoxTable = (FoxTable *) 0, sizeof(myFoxInfo)/sizeof(FoxInfo), myFoxInfo;假設(shè)當(dāng)前打開的表中有名為 amount 的數(shù)值型字段,Visual FoxPro 程序中的下列代碼行可以調(diào)用該函數(shù):復(fù)制代碼? SUM(amount)三、外部庫(kù)的參

11、數(shù)當(dāng) Visual FoxPro 調(diào)用 ActiveX 控件、COM 對(duì)象或 Visual FoxPro 動(dòng)態(tài)連接庫(kù)(FLL)時(shí),可以傳遞參數(shù)。例如,ActiveX 控件可能在調(diào)用它其中一個(gè)方法時(shí)接收參數(shù)。同樣,Visual FoxPro 程序也可能調(diào)用 FLL 庫(kù)中的函數(shù)并將參數(shù)傳遞給它。Visual FoxPro 可以通過值或通過引用將參數(shù)傳遞給外部庫(kù)。在默認(rèn)情況下,遵循 SET UDFPARMS 命令的設(shè)置。然而,其他變量,如數(shù)組或字段,以及表達(dá)式通過值來傳遞。有關(guān)如何改變傳遞參數(shù)默認(rèn)方法的信息,請(qǐng)參見 將數(shù)據(jù)傳遞給參數(shù)。 由于 ActiveX 控件和 COM 對(duì)象是標(biāo)準(zhǔn)的 Window

12、s 程序,不需要特別的機(jī)制將參數(shù)從 Visual FoxPro 傳遞到 ActiveX 控件或 COM 對(duì)象。可以象從任何 C 或 C+ 程序接收參數(shù)那樣編寫庫(kù)代碼。然而,F(xiàn)LL 庫(kù)中的函數(shù)使用 FoxInfo 結(jié)構(gòu)從 Visual FoxPro 中獲取數(shù)據(jù)。FoxInfo 結(jié)構(gòu)列示了庫(kù)函數(shù)以及它們所期待的參數(shù)數(shù)量和類型。例如,下列 FoxInfo 結(jié)構(gòu)屬于帶有一個(gè)內(nèi)部被稱為 dates ,接收一個(gè)字符型參數(shù)的函數(shù)的庫(kù):復(fù)制代碼FoxInfo myFoxInfo = DATES, (FPFI) dates, 1, C ;在外部庫(kù)中定義的函數(shù)實(shí)際上只接收了一個(gè)參數(shù),也就是到參數(shù)塊的指針。該參數(shù)塊

13、,在 ParamBlk 結(jié)構(gòu)中定義,存儲(chǔ)了所有有關(guān)從 Visual FoxPro 函數(shù)調(diào)用傳遞來的參數(shù)信息。下面的代碼舉例說明了函數(shù)聲明應(yīng)當(dāng)遵循的格式:復(fù)制代碼void function_name(ParamBlk *parm)例如,dates 的函數(shù)定義是:復(fù)制代碼void dates(ParamBlk *parm)ParamBlk 結(jié)構(gòu)由表示參數(shù)數(shù)量的整數(shù)組成,后面直接跟隨參數(shù)聯(lián)合的數(shù)組。該結(jié)構(gòu)定義被包含在 Pro_ext.h 中:復(fù)制代碼/* 庫(kù)函數(shù)的參數(shù)列表。 */typedef struct short int pCount; /* 傳遞的參數(shù)數(shù)量 */ Parameter p1;

14、/* pCount 參數(shù) */ ParamBlk;包含在 ParamBlk 結(jié)構(gòu)中的 Parameter typedef 是 Value 結(jié)構(gòu)和 Locator 結(jié)構(gòu)的組合。通過值的調(diào)用由 Value 結(jié)構(gòu)處理;通過引用的調(diào)用由 Locator 結(jié)構(gòu)處理。當(dāng)從 Visual FoxPro 中調(diào)用函數(shù)時(shí),可以使用這些結(jié)構(gòu)接收傳遞到函數(shù)的參數(shù)。下列從 Pro_ext.h 文件中提取出來的信息展示了 Parameter 類型的定義:復(fù)制代碼/* 到庫(kù)函數(shù)的參數(shù)。 */typedef union Value val; Locator loc; Parameter;Value 結(jié)構(gòu)定義如果通過值將參數(shù)傳

15、遞到函數(shù),則使用 Value 結(jié)構(gòu)來接收它。下面的 Value 結(jié)構(gòu)定義是從 Pro_ext.h 文件中提取出來的:復(fù)制代碼/ An expressions value.Typedef struct char ev_type; char ev_padding; short ev_width; unsigned ev_length; long ev_long; double ev_real; CCY ev_currency; MHANDLE ev_handle; ULONG ev_object; Value;Value 結(jié)構(gòu)域下表是對(duì)于不同數(shù)據(jù)類型,可以在 Value 結(jié)構(gòu)中傳遞和接收值的指導(dǎo)。

16、只有為數(shù)據(jù)類型列示的結(jié)構(gòu)域才可以用于該數(shù)據(jù)類型。不同數(shù)據(jù)類型的 Value 結(jié)構(gòu)內(nèi)容數(shù)據(jù)類型結(jié)構(gòu)域值字符型ev_typeCev_length串長(zhǎng)度ev_handle到串的 MHANDLE數(shù)值型ev_typeNev_width顯示寬度ev_length小數(shù)位ev_real雙精度整型(Integer)ev_typeIev_width顯示寬度ev_long長(zhǎng)整型(Long integer)日期型ev_typeDev_real日期1日期時(shí)間(Date Time)ev_typeTev_real日期 + (秒/86400.0)貨幣型ev_typeYev_width顯示寬度ev_currency貨幣值2邏輯

17、型ev_typeLev_length0 或 1備注型ev_typeMev_wdithFCHANev_long備注字段長(zhǎng)度ev_real備注字段偏移量通用(General)ev_typeGev_wdithFCHANev_long通用型字段長(zhǎng)度ev_real通用型字段偏移量對(duì)象(Object)ev_typeOev_object對(duì)象標(biāo)識(shí)符Nullev_type0 (零)ev_long數(shù)據(jù)類型1. 日期被表現(xiàn)為使用 ACM 算法集合中 199 算法(Algorithm 199 from Collected Algorithms of the ACM)計(jì)算出來的雙精度浮點(diǎn)儒略(Julian)日數(shù)字。 2

18、. 貨幣值是長(zhǎng)整型,在最后四個(gè)阿拉伯?dāng)?shù)字之前帶有隱含的小數(shù)點(diǎn)。注意:ev_length 是串長(zhǎng)度的唯一真實(shí)的指示器。由于串可以包含內(nèi)置的 null 字符,因此串不能以 null 作為終止符。Locator 結(jié)構(gòu)定義使用 Locator 結(jié)構(gòu)操作通過引用傳遞的參數(shù)。下面的 Locator 結(jié)構(gòu)定義是從 Pro_ext.h 文件提取的:復(fù)制代碼typedef struct char l_type; short l_where, /* 數(shù)據(jù)庫(kù)編號(hào)或內(nèi)存變量的 -1 */ l_NTI, /* 變量名表的偏移量 */ l_offset, /* 數(shù)據(jù)庫(kù)中的索引 */ l_subs, /* # 指定的下標(biāo)

19、0 = x = 2 */ l_sub1, l_sub2; /* 下標(biāo)整型值 */ Locator;Locator 結(jié)構(gòu)域下表是 Locator 結(jié)構(gòu)中域的指導(dǎo)。Locator 域域的用途l_typeRl_where包含該域的表編號(hào),或變量的 1。l_NTI名稱表索引。Visual FoxPro 內(nèi)部使用。l_offset表中的域編號(hào)。Visual FoxPro 內(nèi)部使用。l_subs只用于變量,下標(biāo)的編號(hào)(0 2)。l_sub1只用于變量,如果 l_subs 不是 0,則為第一個(gè)下標(biāo)。l_sub2只用于變量,如果 l_subs 是 2,則為第二個(gè)下標(biāo)。注意:檢查 ev_type 中的參數(shù)類型以

20、幫助確定從 Value structure 接收的是哪幾個(gè)域是良好的設(shè)計(jì)習(xí)慣。訪問 FLL 庫(kù)中參數(shù)示例下面示例使用 _StrCpy( ) 將字符型類型返回給 Visual FoxPro,那是其兩個(gè)字符型參數(shù)的串聯(lián)。注意,盡管每個(gè)參數(shù) Value 結(jié)構(gòu)的句柄被用于操作內(nèi)存以完成該串聯(lián),但改變內(nèi)存的分配不影響通過值傳遞的 Visual FoxPro 參數(shù)。復(fù)制代碼#include Example(ParamBlk *parm)/ 通過使用 #define 快捷方式使得 paramBlk 結(jié)構(gòu)易于管理#define p0 (parm-p0.val)#define p1 (parm-p1.val)/

21、 確保有足夠的內(nèi)存if (!_SetHandSize(p0.ev_handle, p0.ev_length + p1.ev_length) _Error(182); / 內(nèi)存不足/ 鎖定句柄_HLock(p0.ev_handle);_HLock(p1.ev_handle);/ 將句柄轉(zhuǎn)換為指針并確保串是由 null 作終止符(char *)_HandToPtr(p0.ev_handle)p0.ev_length = 0;(char *)_HandToPtr(p1.ev_handle)p1.ev_length = 0;/ 用 API 函數(shù) _StrCpy 連接串_StrCpy(char *)_H

22、andToPtr(p0.ev_handle) + p0.ev_length,_HandToPtr(p1.ev_handle);/ 將已連接的串返回給 Visual FoxPro_RetChar(_HandToPtr(p0.ev_handle);/ 解除句柄鎖定_HUnLock(p0.ev_handle);_HUnLock(p1.ev_handle);FoxInfo myFoxInfo = STRCAT, Example, 2, CC,;FoxTable _FoxTable = (FoxTable *) 0, sizeof(myFoxInfo)/sizeof(FoxInfo), myFoxInf

23、o;四、創(chuàng)建 Visual FoxPro 動(dòng)態(tài)鏈接庫(kù)Visual FoxPro 動(dòng)態(tài)鏈接庫(kù)本質(zhì)上是一個(gè)包含調(diào)用 Visual FoxPro API 的 DLL。在開發(fā)環(huán)境中,當(dāng)你想添加調(diào)用的 Visual FoxPro 函數(shù)時(shí),你可以創(chuàng)建基本的 DLL 結(jié)構(gòu)。下列章節(jié)講述了在 C 和 C+ 中創(chuàng)建 FLL 模板的模板示例。設(shè)立庫(kù)模板每個(gè) Visual FoxPro FLL 庫(kù)有相同的基本結(jié)構(gòu)。你可以使用一個(gè)關(guān)于結(jié)構(gòu)的模板,所以僅需添加關(guān)于特殊庫(kù)例程的代碼。在一個(gè) Visual FoxPro 庫(kù)模板中有五個(gè)要素:#include 語(yǔ)句。函數(shù)定義。該函數(shù)定義有一個(gè)空的返回值和傳遞 ParamBlk

24、 *parm 的參數(shù)。有關(guān)更多的關(guān)于ParamBlk 參數(shù)的信息請(qǐng)參見在外部庫(kù)中的參數(shù)。函數(shù)代碼。FoxInfo 結(jié)構(gòu)。在 FLL 中的函數(shù)通過 FoxInfo 結(jié)構(gòu)與 Visual FoxPro 結(jié)合。Visual FoxPro 使用 FoxInfo 確定該函數(shù)名和數(shù)字及參數(shù)的類型。FoxTable 結(jié)構(gòu)。FoxTable 結(jié)構(gòu)是一個(gè)明了 FoxInfo 結(jié)構(gòu)的連接列表。有關(guān) FoxInfo 和 FoxTable 結(jié)構(gòu)定義的更多信息,請(qǐng)參見 Pro_ext.h 文件。還需要下列文件:Pro_ext.h 頭文件。你可以打印該文件來查看函數(shù)的聲明、typedefs 和在 Visual FoxPr

25、o API 中使用的結(jié)構(gòu)。Winapims.lib 文件這兩個(gè)文件可在 Microsoft Visual FoxPro .SamplesAPI 目錄中找到。模板示例對(duì)于 C 例程,可以使用下列模板:復(fù)制代碼#include void Internal_Name(ParamBlk *parm)/ Function code goes here.FoxInfo myFoxInfo = FUNC_NAME, (FPFI) Internal_Name, 0, ,;FoxTable _FoxTable = (FoxTable *)0, sizeof(myFoxInfo)/sizeof(FoxInfo),

26、 myFoxInfo;對(duì)于 C+ 例程,在下列模板中需要聲明 FoxTable 作為外部結(jié)構(gòu):復(fù)制代碼#include void Internal_Name(ParamBlk *parm)/ Function code goes here. FoxInfo myFoxInfo = FUNC_NAME, (FPFI) Internal_Name, 0, , ;extern C FoxTable _FoxTable = (FoxTable *)0, sizeof(myFoxInfo)/sizeof(FoxInfo), myFoxInfo ;五、訪問 Visual FoxPro 的變量和字段可以在

27、ActiveX 控件或 FLL 函數(shù)中訪問 Visual FoxPro 的變量和字段值,讀取它們或設(shè)置它們。此外,還可以創(chuàng)建能從 Visual FoxPro 中訪問的新變量。變量和字段可在 Visual FoxPro 中的命名表中得到,那是包含所有當(dāng)前已定義變量和字段名的數(shù)組。可以使用命名表索引(NTI)訪問數(shù)組中的單個(gè)元素。一個(gè)特定的 API 函數(shù) _NameTableIndex( ) 依據(jù)所提供的名稱返回現(xiàn)有變量或字段的索引。確定了給定變量的 NTI 之后,可以使用 _Load( ) API 函數(shù)讀取它或使用 _Store( ) API 函數(shù)設(shè)置它。要?jiǎng)?chuàng)建新變量,可以調(diào)用 API 函數(shù) _

28、NewVar( )。 要訪問 Visual FoxPro 的變量和字段,可以使用 Pro_ext.h 中定義的 Value 和 Locator 結(jié)構(gòu)。如果正在創(chuàng)建 FLL 庫(kù),可以使用被用于訪問傳遞到函數(shù)參數(shù)的同樣技術(shù)。有關(guān) Value 和 Locator 結(jié)構(gòu)的詳細(xì)資料,請(qǐng)參見 外部庫(kù)的參數(shù)。 下面示例舉例說明了如何可以使用 Value 和 Locator 結(jié)構(gòu)在 ActiveX 控件中訪問 Visual FoxPro 變量。復(fù)制代碼long CFoxtlibCtrl:TLGetTypeAttr(long pTypeInfo, LPCTSTR szArrName) int nResult =

29、 1; TYPEATTR *lpTypeAttr; Locator loc; Value val; OLECHAR szGuid128; char *szBuff;_try if (_FindVar(_NameTableIndex( char *)szArrName),-1,&loc) (ITypeInfo *)pTypeInfo)-GetTypeAttr(&lpTypeAttr); if (_ALen(loc.l_NTI, AL_ELEMENTS) guid, (LPOLESTR )&szGuid,sizeof(szGuid); OLEOleToAnsiString(szGuid,&szBu

30、ff); val.ev_type = C; val.ev_length = strlen(szBuff); val.ev_handle = _AllocHand(val.ev_length); _HLock(val.ev_handle); _MemMove(char *) _HandToPtr( val.ev_handle ), szBuff, val.ev_length); OLEFreeString(void *)&szBuff); _HUnLock(val.ev_handle); loc.l_sub1 = 1; _Store(&loc,&val); _FreeHand(val.ev_ha

31、ndle); /2 = LCID loc.l_sub1 = 2; val.ev_type = I; val.ev_long = lpTypeAttr-lcid; _Store(&loc,&val); / code for values 3 - 16 here (ITypeInfo *)pTypeInfo) - ReleaseTypeAttr(lpTypeAttr); _except (EXCEPTION_EXECUTE_HANDLER) nResult = 0; return nResult;六、用 Visual FoxPro API 管理內(nèi)存Visual FoxPro API 提供了對(duì) Vi

32、sual FoxPro 動(dòng)態(tài)內(nèi)存管理器的直接訪問。請(qǐng)求內(nèi)存分配的 API 例程返回識(shí)別內(nèi)存的內(nèi)存句柄。Visual FoxPro 使用句柄而不是指針分段加載結(jié)構(gòu),以便可以更有效地管理內(nèi)存。內(nèi)存句柄實(shí)際上是指針數(shù)組中的索引。該指針指向 Visual FoxPro 掌握的內(nèi)存塊。API 中幾乎所有對(duì)內(nèi)存的引用都是通過幾柄而不是更傳統(tǒng)的 C 指針來實(shí)現(xiàn)。理解堆棧所創(chuàng)建的控件或庫(kù)并不具有自己的內(nèi)存堆棧。相反,它使用調(diào)用程序的內(nèi)存堆棧,或這里的 Visual FoxPro 堆棧。然而,無法控制 Visual FoxPro 堆棧的大小或影響 ActiveX 控件或 FLL 可用堆棧空間的總數(shù)。在正常情況下

33、,這個(gè)差別并不重要。Visual FoxPro 堆棧通常大到足以支撐可能要在控件或庫(kù)中指派的自動(dòng)變量。如果用完了堆棧空間,始終可以動(dòng)態(tài)地在堆棧上指派額外的內(nèi)存。使用句柄的規(guī)則下列規(guī)則適用于內(nèi)存句柄的指派和釋放:用戶必須釋放他們指派的所有句柄,包括通過 _Load() 之類函數(shù)指派的句柄。_Load() 只在所加載的變量是字符串(即,ev_type = C)時(shí)才創(chuàng)建句柄。所有其他數(shù)據(jù)類型在它自己的 Value 結(jié)構(gòu)中存儲(chǔ)其值,而字符串的加載將 MHANDLE 放置到 Value 結(jié)構(gòu)的 ev_handle 中。在 FLL 庫(kù)中,Visual FoxPro 負(fù)責(zé)釋放所有用 _RetVal( ) 返

34、回的句柄。即使用戶指派了它們,也不能釋放這些句柄。用戶不能釋放 ParamBlk 中傳遞的句柄。警告:當(dāng)編寫調(diào)用函數(shù)的外部例程序時(shí),確定遵從了所有規(guī)則并檢查了返回結(jié)果。迷失的指針和句柄引用可以損害 Visual FoxPro 內(nèi)部數(shù)據(jù)結(jié)構(gòu),導(dǎo)致直接的異常終止或遺留的問題,可以導(dǎo)致數(shù)據(jù)丟失。七、如何管理內(nèi)存可以使用 Visual FoxPro API 分配和管理內(nèi)存。注意:所描述的技術(shù)適用于 ActiveX 控件和 FLL 庫(kù)。要分配和使用內(nèi)存用 _AllocHand( ) 分配句柄。 用 _HLock( ) 鎖定句柄。 用 _HandToPtr( ) 將句柄轉(zhuǎn)換為指針。 通過使用指針來引用內(nèi)存

35、。用 _HUnLock( ) 解鎖句柄。 注意:要避免損壞備注文件,在調(diào)用 _AllocMemo( ) 之前不要寫備注文件。為了確定已分配內(nèi)存的地址,API 例程必須調(diào)用 _HandToPtr( ) 例程將句柄轉(zhuǎn)換為指針。即使 Visual FoxPro 內(nèi)存管理器需要重新組織內(nèi)存以便為后來的內(nèi)存請(qǐng)求獲取更加連續(xù)的內(nèi)存,該句柄也保持不變。同時(shí)還提供了增加、減少、釋放和鎖定內(nèi)存分配的例程。在創(chuàng)建外部例程時(shí),應(yīng)盡量減少內(nèi)存的使用。如果創(chuàng)建了動(dòng)態(tài)分配內(nèi)存的外部例程,盡可能少地使用內(nèi)存。對(duì)于長(zhǎng)時(shí)間鎖定大量?jī)?nèi)存分配時(shí)要特別小心。記住在不再需要鎖定時(shí)用 _HUnLock( ) 解鎖內(nèi)存句柄,因?yàn)殒i定內(nèi)存句

36、柄會(huì)對(duì) Visual FoxPro 的性能產(chǎn)生不利影響。警告:過多地使用動(dòng)態(tài)內(nèi)存會(huì)侵占 Visual FoxPro 緩沖、窗口、菜單等的內(nèi)存,并導(dǎo)致性能降低,因?yàn)闈M足 API 需求的內(nèi)存是由 Visual FoxPro 內(nèi)存管理器進(jìn)行管理的。分配大量句柄并保留它們可以導(dǎo)致 Visual FoxPro 用完內(nèi)存并異常終止。Visual FoxPro 環(huán)境不具備內(nèi)存保護(hù)。外部 API 例程不能完全提供標(biāo)準(zhǔn) Visual FoxPro 程序中固有的檢驗(yàn)。如果破壞了內(nèi)存,將會(huì)接受到“跨越句柄(Transgressed handle)”、“內(nèi)部一致性錯(cuò)誤(Internal consistency err

37、or)” 和 “壓縮過程中跨越節(jié)點(diǎn)(Transgressed node during compaction)” 之類的信息。下面 FLL 庫(kù)中的函數(shù)舉例說明了內(nèi)存的分配。該示例使用 _RetDateStr( ) 返回了一個(gè) Visual FoxPro 日期型 類型(假定 Character 參數(shù)是正確的日期):復(fù)制代碼#include void dates(ParamBlk *parm) MHANDLE mh; char *instring; if (mh = _AllocHand(parm-p0.val.ev_length + 1) = 0) _Error(182); / 內(nèi)存不足 _HLock(parm-p0.val.ev_handle); instring = _HandToPtr(parm-p0.val.ev_handle); instringparm-p0.val.ev_length = 0; _RetDateStr(instring); _HUnLock(parm-p0.val.ev_handle);FoxInfo myFoxInfo = DATES, (FPFI) dates, 1, C;FoxTable _FoxTable = (FoxTable *) 0

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論