




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、一、將參數(shù)傳遞到 Visual FoxPro API 函數(shù)1二、如何從 ActiveX 控件和 FLL 庫返回值2三、外部庫的參數(shù)4四、創(chuàng)建 Visual FoxPro 動(dòng)態(tài)鏈接庫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 語句將 FAR、_far 和 _far 重新定義為 null 值。 Visual FoxPro API 數(shù)據(jù)結(jié)構(gòu)下表列示了 Visual Fo
4、xPro API 庫中使用的主要數(shù)據(jù)結(jié)構(gòu)。結(jié)構(gòu)說明EventRec用于描述給定時(shí)間上系統(tǒng)正在進(jìn)行什么操作的結(jié)構(gòu)。FoxInfo用于 FLL 庫中 Visual FoxPro 和程序間的通訊,不能用于 .ocx 文件。FoxTable用于 FLL 庫中 Visual FoxPro 和程序間的通訊,不能用于 .ocx 文件。Locator用于訪問參數(shù)值(FLL)或 Visual FoxPro 變量或字段(FLL 和 ocx)的結(jié)構(gòu)。ParamBlk用于 FLL 庫中 Visual FoxPro 和程序間的通訊,不能用于 .ocx 文件。Parameter用于 FLL 庫中 Visual FoxPr
5、o 和程序間的通訊,不能用于 .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 庫返回值可以將值從 ActiveX 控件或 Visual FoxPro 動(dòng)態(tài)連接庫(FLL) 中返回到 Visual FoxPro。要將值從 ActiveX 控件返回到 Visual
6、FoxPro在該控件中使用 RETURN 語句并傳遞單個(gè)值。下列示例使用 RETURN 語句返回存儲(chǔ)在 VERSION 中的版本號(hào):復(fù)制代碼#define VERSION 101/ 此處是其他代碼long CPyCtrl:GetVersion() / 在變量 fVersion 中設(shè)置版本號(hào) return VERSION;從 FLL 庫中返回值當(dāng)要從 FLL 庫中返回值時(shí),請(qǐng)使用 API 函數(shù),而不是 C 或 C+ 本身的命令。注意:當(dāng)從 ActiveX 控件 (.ocx) 文件中返回值時(shí),不要使用 API 函數(shù)從該 FLL 庫中返回值,而使用 RETURN 語句。 要從 FLL 庫中
7、返回值使用下表所列示的 API 函數(shù)。下列 API 函數(shù)只能用于 FLL 庫。函數(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è)置函
8、數(shù)返回值為為浮點(diǎn)值。_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 字段。
9、0;下面示例,Sum 接收了對(duì)表中數(shù)值型字段的引用并使用 _RetFloat 返回了該字段值的和:復(fù)制代碼#include <Pro_ext.h>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 < rec_cnt; i+)
10、/將字段值放置到 Value 結(jié)構(gòu)中 _Load(&parm->p0.loc, &val); / 將該值添加到累計(jì)總數(shù) tot += val.ev_real; / SKIP 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(m
11、yFoxInfo)/sizeof(FoxInfo), myFoxInfo;假設(shè)當(dāng)前打開的表中有名為 amount 的數(shù)值型字段,Visual FoxPro 程序中的下列代碼行可以調(diào)用該函數(shù):復(fù)制代碼? SUM(amount)三、外部庫的參數(shù)當(dāng) Visual FoxPro 調(diào)用 ActiveX 控件、COM 對(duì)象或 Visual FoxPro 動(dòng)態(tài)連接庫(FLL)時(shí),可以傳遞參數(shù)。例如,ActiveX 控件可能在調(diào)用它其中一個(gè)方法時(shí)接收參數(shù)。同樣,Visual FoxPro 程序也可能調(diào)用 FLL 庫中的函數(shù)并將參數(shù)傳遞給它。Visual FoxPro 可以通過值或通過引用將參數(shù)傳遞給外部庫。在
12、默認(rèn)情況下,遵循 SET UDFPARMS 命令的設(shè)置。然而,其他變量,如數(shù)組或字段,以及表達(dá)式通過值來傳遞。有關(guān)如何改變傳遞參數(shù)默認(rèn)方法的信息,請(qǐng)參見 將數(shù)據(jù)傳遞給參數(shù)。 由于 ActiveX 控件和 COM 對(duì)象是標(biāo)準(zhǔn)的 Windows 程序,不需要特別的機(jī)制將參數(shù)從 Visual FoxPro 傳遞到 ActiveX 控件或 COM 對(duì)象。可以象從任何 C 或 C+ 程序接收參數(shù)那樣編寫庫代碼。然而,F(xiàn)LL 庫中的函數(shù)使用 FoxInfo 結(jié)構(gòu)從 Visual FoxPro 中獲取數(shù)據(jù)。FoxInfo 結(jié)構(gòu)列示了庫函數(shù)以及它們所期待的參數(shù)數(shù)量和類型。例如,下列 FoxInfo 結(jié)構(gòu)屬于帶
13、有一個(gè)內(nèi)部被稱為 dates ,接收一個(gè)字符型參數(shù)的函數(shù)的庫:復(fù)制代碼FoxInfo myFoxInfo = "DATES", (FPFI) dates, 1, "C" ;在外部庫中定義的函數(shù)實(shí)際上只接收了一個(gè)參數(shù),也就是到參數(shù)塊的指針。該參數(shù)塊,在 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 *pa
14、rm)ParamBlk 結(jié)構(gòu)由表示參數(shù)數(shù)量的整數(shù)組成,后面直接跟隨參數(shù)聯(lián)合的數(shù)組。該結(jié)構(gòu)定義被包含在 Pro_ext.h 中:復(fù)制代碼/* 庫函數(shù)的參數(shù)列表。 */typedef struct short int pCount; /* 傳遞的參數(shù)數(shù)量 */ Parameter p1; /* 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í),可以使用這
15、些結(jié)構(gòu)接收傳遞到函數(shù)的參數(shù)。下列從 Pro_ext.h 文件中提取出來的信息展示了 Parameter 類型的定義:復(fù)制代碼/* 到庫函數(shù)的參數(shù)。 */typedef union Value val; Locator loc; Parameter;Value 結(jié)構(gòu)定義如果通過值將參數(shù)傳遞到函數(shù),則使用 Value 結(jié)構(gòu)來接收它。下面的 Value 結(jié)構(gòu)定義是從 Pro_ext.h 文件中提取出來的:復(fù)制代碼/ An expression's value.Typedef struct char ev_type; char ev_padding; short ev_width; unsig
16、ned 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)。只有為數(shù)據(jù)類型列示的結(jié)構(gòu)域才可以用于該數(shù)據(jù)類型。不同數(shù)據(jù)類型的 Value 結(jié)構(gòu)內(nèi)容數(shù)據(jù)類型結(jié)構(gòu)域值字符型ev_type'C' ev_length串長度 ev_handle到串的 MHANDLE數(shù)值型ev_type'N' ev_width顯示
17、寬度 ev_length小數(shù)位 ev_real雙精度整型(Integer)ev_type'I' ev_width顯示寬度 ev_long長整型(Long integer)日期型ev_type'D' ev_real日期1日期時(shí)間(Date Time)ev_type'T' ev_real日期 + (秒/86400.0)貨幣型ev_type'Y' ev_width顯示寬度 ev_currency貨幣值2邏輯型ev_type'L' e
18、v_length0 或 1備注型ev_type'M' ev_wdithFCHAN ev_long備注字段長度 ev_real備注字段偏移量通用(General)ev_type'G' ev_wdithFCHAN ev_long通用型字段長度 ev_real通用型字段偏移量對(duì)象(Object)ev_type'O' ev_object對(duì)象標(biāo)識(shí)符Nullev_type'0' (零) ev_long數(shù)據(jù)類型1. 日期被表現(xiàn)為使用 ACM 算法集合中 199 算法
19、(Algorithm 199 from Collected Algorithms of the ACM)計(jì)算出來的雙精度浮點(diǎn)儒略(Julian)日數(shù)字。 2. 貨幣值是長整型,在最后四個(gè)阿拉伯?dāng)?shù)字之前帶有隱含的小數(shù)點(diǎn)。注意:ev_length 是串長度的唯一真實(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, /*
20、 數(shù)據(jù)庫編號(hào)或內(nèi)存變量的 -1 */ l_NTI, /* 變量名表的偏移量 */ l_offset, /* 數(shù)據(jù)庫中的索引 */ l_subs, /* # 指定的下標(biāo) 0 <= x <= 2 */ l_sub1, l_sub2; /* 下標(biāo)整型值 */ Locator;Locator 結(jié)構(gòu)域下表是 Locator 結(jié)構(gòu)中域的指導(dǎo)。Locator 域域的用途l_type'R'l_where包含該域的表編號(hào),或變量的 1。l_NTI名稱表索引。Visual FoxPro 內(nèi)部使用。l_offset表中的域編號(hào)。Visual FoxPro 內(nèi)部使用。l_subs只用于變量
21、,下標(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ù)類型以幫助確定從 Value structure 接收的是哪幾個(gè)域是良好的設(shè)計(jì)習(xí)慣。 訪問 FLL 庫中參數(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 &
22、lt;Pro_ext.h>Example(ParamBlk *parm)/ 通過使用 #define 快捷方式使得 paramBlk 結(jié)構(gòu)易于管理#define p0 (parm->p0.val)#define p1 (parm->p1.val)/ 確保有足夠的內(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)換為指針并確保串是由 n
23、ull 作終止符(char *)_HandToPtr(p0.ev_handle)p0.ev_length = '0'(char *)_HandToPtr(p1.ev_handle)p1.ev_length = '0'/ 用 API 函數(shù) _StrCpy 連接串_StrCpy(char *)_HandToPtr(p0.ev_handle) + p0.ev_length,_HandToPtr(p1.ev_handle);/ 將已連接的串返回給 Visual FoxPro_RetChar(_HandToPtr(p0.ev_handle);/ 解除句柄鎖定_HUnLoc
24、k(p0.ev_handle);_HUnLock(p1.ev_handle);FoxInfo myFoxInfo = "STRCAT", Example, 2, "CC",;FoxTable _FoxTable = (FoxTable *) 0, sizeof(myFoxInfo)/sizeof(FoxInfo), myFoxInfo;四、創(chuàng)建 Visual FoxPro 動(dòng)態(tài)鏈接庫Visual FoxPro 動(dòng)態(tài)鏈接庫本質(zhì)上是一個(gè)包含調(diào)用 Visual FoxPro API 的 DLL。在開發(fā)環(huán)境中,當(dāng)你想添加調(diào)用的 Visual FoxPro 函數(shù)時(shí)
25、,你可以創(chuàng)建基本的 DLL 結(jié)構(gòu)。下列章節(jié)講述了在 C 和 C+ 中創(chuàng)建 FLL 模板的模板示例。設(shè)立庫模板每個(gè) Visual FoxPro FLL 庫有相同的基本結(jié)構(gòu)。你可以使用一個(gè)關(guān)于結(jié)構(gòu)的模板,所以僅需添加關(guān)于特殊庫例程的代碼。在一個(gè) Visual FoxPro 庫模板中有五個(gè)要素:#include 語句。函數(shù)定義。該函數(shù)定義有一個(gè)空的返回值和傳遞 ParamBlk *parm 的參數(shù)。有關(guān)更多的關(guān)于ParamBlk 參數(shù)的信息請(qǐng)參見在外部庫中的參數(shù)。函數(shù)代碼。FoxInfo 結(jié)構(gòu)。在 FLL 中的函數(shù)通過 FoxInfo 結(jié)構(gòu)與 Visual FoxPro 結(jié)合。Visual FoxP
26、ro 使用 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 FoxPro API 中使用的結(jié)構(gòu)。Winapims.lib 文件這兩個(gè)文件可在 Microsoft Visual FoxPro .SamplesAPI 目錄中找到。模板示例對(duì)于 C 例程,可以使用下列模板:復(fù)制代碼#inc
27、lude <Pro_ext.h>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), myFoxInfo;對(duì)于 C+ 例程,在下列模板中需要聲明 FoxTable 作為外部結(jié)構(gòu):復(fù)制代碼#include <Pr
28、o_ext.h>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 的變量和字段可以在 ActiveX 控件或 F
29、LL 函數(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ù) _NewVar( )。 要訪
30、問 Visual FoxPro 的變量和字段,可以使用 Pro_ext.h 中定義的 Value 和 Locator 結(jié)構(gòu)。如果正在創(chuàng)建 FLL 庫,可以使用被用于訪問傳遞到函數(shù)參數(shù)的同樣技術(shù)。有關(guān) Value 和 Locator 結(jié)構(gòu)的詳細(xì)資料,請(qǐng)參見 外部庫的參數(shù)。 下面示例舉例說明了如何可以使用 Value 和 Locator 結(jié)構(gòu)在 ActiveX 控件中訪問 Visual FoxPro 變量。復(fù)制代碼long CFoxtlibCtrl:TLGetTypeAttr(long pTypeInfo, LPCTSTR szArrName) int nResult = 1; TYPEATTR
31、*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) < 16) _Error(631); /Array argument not of proper size. /1 = Guid Strin
32、gFromGUID2(lpTypeAttr->guid, (LPOLESTR )&szGuid,sizeof(szGuid); OLEOleToAnsiString(szGuid,&szBuff); 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_leng
33、th); OLEFreeString(void *)&szBuff); _HUnLock(val.ev_handle); loc.l_sub1 = 1; _Store(&loc,&val); _FreeHand(val.ev_handle); /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
34、) -> ReleaseTypeAttr(lpTypeAttr); _except (EXCEPTION_EXECUTE_HANDLER) nResult = 0; return nResult;六、用 Visual FoxPro API 管理內(nèi)存Visual FoxPro API 提供了對(duì) Visual 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ì)
35、內(nèi)存的引用都是通過幾柄而不是更傳統(tǒng)的 C 指針來實(shí)現(xiàn)。理解堆棧所創(chuàng)建的控件或庫并不具有自己的內(nèi)存堆棧。相反,它使用調(diào)用程序的內(nèi)存堆棧,或這里的 Visual FoxPro 堆棧。然而,無法控制 Visual FoxPro 堆棧的大小或影響 ActiveX 控件或 FLL 可用堆棧空間的總數(shù)。在正常情況下,這個(gè)差別并不重要。Visual FoxPro 堆棧通常大到足以支撐可能要在控件或庫中指派的自動(dòng)變量。如果用完了堆??臻g,始終可以動(dòng)態(tài)地在堆棧上指派額外的內(nèi)存。使用句柄的規(guī)則下列規(guī)則適用于內(nèi)存句柄的指派和釋放:用戶必須釋放他們指派的所有句柄,包括通過 _Load() 之類函數(shù)指派的句柄。_Loa
36、d() 只在所加載的變量是字符串(即,ev_type = 'C')時(shí)才創(chuàng)建句柄。所有其他數(shù)據(jù)類型在它自己的 Value 結(jié)構(gòu)中存儲(chǔ)其值,而字符串的加載將 MHANDLE 放置到 Value 結(jié)構(gòu)的 ev_handle 中。在 FLL 庫中,Visual FoxPro 負(fù)責(zé)釋放所有用 _RetVal( ) 返回的句柄。即使用戶指派了它們,也不能釋放這些句柄。用戶不能釋放 ParamBlk 中傳遞的句柄。警告:當(dāng)編寫調(diào)用函數(shù)的外部例程序時(shí),確定遵從了所有規(guī)則并檢查了返回結(jié)果。迷失的指針和句柄引用可以損害 Visual FoxPro 內(nèi)部數(shù)據(jù)結(jié)構(gòu),導(dǎo)致直接的異常終止或遺留的問題,可以
37、導(dǎo)致數(shù)據(jù)丟失。 七、如何管理內(nèi)存可以使用 Visual FoxPro API 分配和管理內(nèi)存。注意:所描述的技術(shù)適用于 ActiveX 控件和 FLL 庫。 要分配和使用內(nèi)存用 _AllocHand( ) 分配句柄。 用 _HLock( ) 鎖定句柄。 用 _HandToPtr( ) 將句柄轉(zhuǎn)換為指針。 通過使用指針來引用內(nèi)存。用 _HUnLock( ) 解鎖句柄。 注意:要避免損壞備注文件,在調(diào)用 _AllocMemo( ) 之前不要寫備注文件。為了確定已分配內(nèi)存的地址,API 例程必須調(diào)用 _HandToPtr( ) 例程將句柄轉(zhuǎn)換為指針。即使 Visual FoxPr
38、o 內(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ì)于長時(shí)間鎖定大量內(nèi)存分配時(shí)要特別小心。記住在不再需要鎖定時(shí)用 _HUnLock( ) 解鎖內(nèi)存句柄,因?yàn)殒i定內(nèi)存句柄會(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)行管理的。分配大量句
39、柄并保留它們可以導(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 error)” 和 “壓縮過程中跨越節(jié)點(diǎn)(Transgressed node during compaction)” 之類的信息。 下面 FLL 庫中的函數(shù)舉例說明了內(nèi)存的分配。該示例使用 _RetDateStr( ) 返回了一個(gè) Visual F
40、oxPro 日期型 類型(假定 Character 參數(shù)是正確的日期):復(fù)制代碼#include <Pro_ext.h>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, sizeof(myFoxInfo)/sizeof(FoxInfo), myFoxInfo;八、FoxInfo 結(jié)構(gòu)FoxInfo 結(jié)構(gòu)被用于在 Visual FoxPr
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 目視化管理與產(chǎn)品開發(fā)考核試卷
- 銻冶煉生產(chǎn)數(shù)據(jù)分析與應(yīng)用技巧考核試卷
- 管道工程法律法規(guī)政策深度研究與探討考核試卷
- 鐵路軌道電路調(diào)試技術(shù)考核試卷
- 航空航天器材料與工藝考核試卷
- 新生兒黃疸檢測的臨床意義
- 肺部真菌感染診斷與治療進(jìn)展
- 轉(zhuǎn)運(yùn)呼吸機(jī)操作規(guī)范
- 防呼吸道傳染病科普講座
- 視網(wǎng)膜動(dòng)脈阻塞性疾病
- 新蘇教版牛津英語 英語四年級(jí)下冊(cè)期末試卷
- 生產(chǎn)異常停線管理規(guī)范標(biāo)準(zhǔn)
- DB32∕T 4064-2021 江蘇省城鎮(zhèn)燃?xì)獍踩珯z查標(biāo)準(zhǔn)
- 四川省瀘州市瀘縣2021-2022學(xué)年八年級(jí)下學(xué)期期末數(shù)學(xué)試題(word版只含選擇填空題答案)
- 國際匯款查詢查復(fù)業(yè)務(wù)培訓(xùn)3
- 高中信息技術(shù)會(huì)考試題(必修部分)附答案
- 設(shè)備保全點(diǎn)檢表(TPM推行必看)
- 市質(zhì)監(jiān)站工程竣工驗(yàn)收工作流程圖
- 新世紀(jì)大學(xué)英語綜合教程4 Unit1
- 振型中的節(jié)點(diǎn),節(jié)線,節(jié)徑和節(jié)圓
- 全口義齒修復(fù)
評(píng)論
0/150
提交評(píng)論