版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、.一、將參數(shù)傳遞到 Visual FoxPro API 函數(shù)1二、如何從 ActiveX 控件和 FLL 庫返回值2三、外部庫的參數(shù)4四、創(chuàng)建 Visual FoxPro 動態(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)實際的類型定義和結(jié)構(gòu)定義
2、,參考 Pro_ext.h 文件。Visual FoxPro API 數(shù)據(jù)類型下列數(shù)據(jù)類型可用于 Visual FoxPro API 例程。數(shù)據(jù)類型說明EDLINE編輯窗口中打開文件中的行號。第一行是 1。EDPOS編輯窗口中打開文件中字符的偏移位置。該文件或備注文件中第一個字符的偏移位置是 0。FCHAN文件通道。每個由 Visual FoxPro 或使用 _FCreate( ) 和 _FOpen( ) 通過 API 打開的文件都被指派一個 FCHAN。FPFI指向返回整數(shù)值函數(shù)的 32 位指針。ITEMID指派給菜單上單個命令的唯一標(biāo)識符。MENUID指派給菜單的唯一標(biāo)識符。MHANDLE
3、給予每個由 Visual FoxPro 或使用 _AllocHand( ) 通過 API 分配的內(nèi)存塊的唯一標(biāo)識符。可以使用 _HandToPtr( ) 放棄對指針的引用。 NTI命名表索引。每個變量和表字段名都擁有該表中的一項。WHANDLE窗口句柄。指派給由 Visual FoxPro 或使用 _WOpen( ) 通過 API 打開窗口的唯一標(biāo)識符。 注意:由于 FAR 指針不適合于 32 位編譯器,Pro_ext.h 中的 #define 語句將 FAR、_far 和 _far 重新定義為 null 值。Visual FoxPro API 數(shù)據(jù)結(jié)構(gòu)下表列示了 Visual FoxPro
4、API 庫中使用的主要數(shù)據(jù)結(jié)構(gòu)。結(jié)構(gòu)說明EventRec用于描述給定時間上系統(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 FoxPro 和程序
5、間的通訊,不能用于 .ocx 文件。Point定義屏幕上單個點(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 動態(tài)連接庫(FLL) 中返回到 Visual FoxPro。要將值從 ActiveX 控件返回到 Visual FoxPr
6、o在該控件中使用 RETURN 語句并傳遞單個值。下列示例使用 RETURN 語句返回存儲在 VERSION 中的版本號:復(fù)制代碼#define VERSION 101/ 此處是其他代碼long CPyCtrl:GetVersion() / 在變量 fVersion 中設(shè)置版本號 return VERSION;從 FLL 庫中返回值當(dāng)要從 FLL 庫中返回值時,請使用 API 函數(shù),而不是 C 或 C+ 本身的命令。注意:當(dāng)從 ActiveX 控件 (.ocx) 文件中返回值時,不要使用 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 格式指定的日期和時間。_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. 值。注意:要返回對象數(shù)據(jù)類型的值,請使用 _RetVal() 函數(shù)填充 Value 結(jié)構(gòu)的 ev_object 字段。下面示例,Sum 接收了對表中
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); / 將該值添加到累計總數(shù) tot += val.ev_real; / SK
10、IP 1 在工作區(qū)中下跳一條記錄 _DBSkip(workarea, 1); / 將總數(shù)值返回到 Visual FoxPro_RetFloat(tot, 10, 4); / Sum 函數(shù)獲得一個引用參數(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)三、外部庫的參
11、數(shù)當(dāng) Visual FoxPro 調(diào)用 ActiveX 控件、COM 對象或 Visual FoxPro 動態(tài)連接庫(FLL)時,可以傳遞參數(shù)。例如,ActiveX 控件可能在調(diào)用它其中一個方法時接收參數(shù)。同樣,Visual FoxPro 程序也可能調(diào)用 FLL 庫中的函數(shù)并將參數(shù)傳遞給它。Visual FoxPro 可以通過值或通過引用將參數(shù)傳遞給外部庫。在默認(rèn)情況下,遵循 SET UDFPARMS 命令的設(shè)置。然而,其他變量,如數(shù)組或字段,以及表達(dá)式通過值來傳遞。有關(guān)如何改變傳遞參數(shù)默認(rèn)方法的信息,請參見 將數(shù)據(jù)傳遞給參數(shù)。 由于 ActiveX 控件和 COM 對象是標(biāo)準(zhǔn)的 Window
12、s 程序,不需要特別的機(jī)制將參數(shù)從 Visual FoxPro 傳遞到 ActiveX 控件或 COM 對象??梢韵髲娜魏?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)屬于帶有一個內(nèi)部被稱為 dates ,接收一個字符型參數(shù)的函數(shù)的庫:復(fù)制代碼FoxInfo myFoxInfo = DATES, (FPFI) dates, 1, C ;在外部庫中定義的函數(shù)實際上只接收了一個參數(shù),也就是到參數(shù)塊的指針。該參數(shù)塊
13、,在 ParamBlk 結(jié)構(gòu)中定義,存儲了所有有關(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ù)制代碼/* 庫函數(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ù)時,可以使用這些結(jié)構(gòu)接收傳遞到函數(shù)的參數(shù)。下列從 Pro_ext.h 文件中提取出來的信息展示了 Parameter 類型的定義:復(fù)制代碼/* 到庫函數(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)域下表是對于不同數(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串長度ev_handle到串的 MHANDLE數(shù)值型ev_typeNev_width顯示寬度ev_length小數(shù)位ev_real雙精度整型(Integer)ev_typeIev_width顯示寬度ev_long長整型(Long integer)日期型ev_typeDev_real日期1日期時間(Date Time)ev_typeTev_real日期 + (秒/86400.0)貨幣型ev_typeYev_width顯示寬度ev_currency貨幣值2邏輯
17、型ev_typeLev_length0 或 1備注型ev_typeMev_wdithFCHANev_long備注字段長度ev_real備注字段偏移量通用(General)ev_typeGev_wdithFCHANev_long通用型字段長度ev_real通用型字段偏移量對象(Object)ev_typeOev_object對象標(biāo)識符Nullev_type0 (零)ev_long數(shù)據(jù)類型1. 日期被表現(xiàn)為使用 ACM 算法集合中 199 算法(Algorithm 199 from Collected Algorithms of the ACM)計算出來的雙精度浮點(diǎn)儒略(Julian)日數(shù)字。 2
18、. 貨幣值是長整型,在最后四個阿拉伯?dāng)?shù)字之前帶有隱含的小數(shù)點(diǎn)。注意:ev_length 是串長度的唯一真實的指示器。由于串可以包含內(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ù)庫編號或內(nèi)存變量的 -1 */ l_NTI, /* 變量名表的偏移量 */ l_offset, /* 數(shù)據(jù)庫中的索引 */ 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包含該域的表編號,或變量的 1。l_NTI名稱表索引。Visual FoxPro 內(nèi)部使用。l_offset表中的域編號。Visual FoxPro 內(nèi)部使用。l_subs只用于變量,下標(biāo)的編號(0 2)。l_sub1只用于變量,如果 l_subs 不是 0,則為第一個下標(biāo)。l_sub2只用于變量,如果 l_subs 是 2,則為第二個下標(biāo)。注意:檢查 ev_type 中的參數(shù)類型以
20、幫助確定從 Value structure 接收的是哪幾個域是良好的設(shè)計習(xí)慣。訪問 FLL 庫中參數(shù)示例下面示例使用 _StrCpy( ) 將字符型類型返回給 Visual FoxPro,那是其兩個字符型參數(shù)的串聯(lián)。注意,盡管每個參數(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 動態(tài)鏈接庫Visual FoxPro 動態(tài)鏈接庫本質(zhì)上是一個包含調(diào)用 Visual FoxPro API 的 DLL。在開發(fā)環(huán)境中,當(dāng)你想添加調(diào)用的 Visual FoxPro 函數(shù)時,你可以創(chuàng)建基本的 DLL 結(jié)構(gòu)。下列章節(jié)講述了在 C 和 C+ 中創(chuàng)建 FLL 模板的模板示例。設(shè)立庫模板每個 Visual FoxPro FLL 庫有相同的基本結(jié)構(gòu)。你可以使用一個關(guān)于結(jié)構(gòu)的模板,所以僅需添加關(guān)于特殊庫例程的代碼。在一個 Visual FoxPro 庫模板中有五個要素:#include 語句。函數(shù)定義。該函數(shù)定義有一個空的返回值和傳遞 ParamBlk
24、 *parm 的參數(shù)。有關(guān)更多的關(guān)于ParamBlk 參數(shù)的信息請參見在外部庫中的參數(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)是一個明了 FoxInfo 結(jié)構(gòu)的連接列表。有關(guān) FoxInfo 和 FoxTable 結(jié)構(gòu)定義的更多信息,請參見 Pro_ext.h 文件。還需要下列文件:Pro_ext.h 頭文件。你可以打印該文件來查看函數(shù)的聲明、typedefs 和在 Visual FoxPr
25、o API 中使用的結(jié)構(gòu)。Winapims.lib 文件這兩個文件可在 Microsoft Visual FoxPro .SamplesAPI 目錄中找到。模板示例對于 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;對于 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ù)組中的單個元素。一個特定的 API 函數(shù) _NameTableIndex( ) 依據(jù)所提供的名稱返回現(xiàn)有變量或字段的索引。確定了給定變量的 NTI 之后,可以使用 _Load( ) API 函數(shù)讀取它或使用 _Store( ) API 函數(shù)設(shè)置它。要創(chuàng)建新變量,可以調(diào)用 API 函數(shù) _
28、NewVar( )。 要訪問 Visual FoxPro 的變量和字段,可以使用 Pro_ext.h 中定義的 Value 和 Locator 結(jié)構(gòu)。如果正在創(chuàng)建 FLL 庫,可以使用被用于訪問傳遞到函數(shù)參數(shù)的同樣技術(shù)。有關(guān) Value 和 Locator 結(jié)構(gòu)的詳細(xì)資料,請參見 外部庫的參數(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 提供了對 Vi
32、sual FoxPro 動態(tài)內(nèi)存管理器的直接訪問。請求內(nèi)存分配的 API 例程返回識別內(nèi)存的內(nèi)存句柄。Visual FoxPro 使用句柄而不是指針分段加載結(jié)構(gòu),以便可以更有效地管理內(nèi)存。內(nèi)存句柄實際上是指針數(shù)組中的索引。該指針指向 Visual FoxPro 掌握的內(nèi)存塊。API 中幾乎所有對內(nèi)存的引用都是通過幾柄而不是更傳統(tǒng)的 C 指針來實現(xiàn)。理解堆棧所創(chuàng)建的控件或庫并不具有自己的內(nèi)存堆棧。相反,它使用調(diào)用程序的內(nèi)存堆棧,或這里的 Visual FoxPro 堆棧。然而,無法控制 Visual FoxPro 堆棧的大小或影響 ActiveX 控件或 FLL 可用堆棧空間的總數(shù)。在正常情況下
33、,這個差別并不重要。Visual FoxPro 堆棧通常大到足以支撐可能要在控件或庫中指派的自動變量。如果用完了堆棧空間,始終可以動態(tài)地在堆棧上指派額外的內(nèi)存。使用句柄的規(guī)則下列規(guī)則適用于內(nèi)存句柄的指派和釋放:用戶必須釋放他們指派的所有句柄,包括通過 _Load() 之類函數(shù)指派的句柄。_Load() 只在所加載的變量是字符串(即,ev_type = C)時才創(chuàng)建句柄。所有其他數(shù)據(jù)類型在它自己的 Value 結(jié)構(gòu)中存儲其值,而字符串的加載將 MHANDLE 放置到 Value 結(jié)構(gòu)的 ev_handle 中。在 FLL 庫中,Visual FoxPro 負(fù)責(zé)釋放所有用 _RetVal( ) 返
34、回的句柄。即使用戶指派了它們,也不能釋放這些句柄。用戶不能釋放 ParamBlk 中傳遞的句柄。警告:當(dāng)編寫調(diào)用函數(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 庫。要分配和使用內(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)存請求獲取更加連續(xù)的內(nèi)存,該句柄也保持不變。同時還提供了增加、減少、釋放和鎖定內(nèi)存分配的例程。在創(chuàng)建外部例程時,應(yīng)盡量減少內(nèi)存的使用。如果創(chuàng)建了動態(tài)分配內(nèi)存的外部例程,盡可能少地使用內(nèi)存。對于長時間鎖定大量內(nèi)存分配時要特別小心。記住在不再需要鎖定時用 _HUnLock( ) 解鎖內(nèi)存句柄,因為鎖定內(nèi)存句
36、柄會對 Visual FoxPro 的性能產(chǎn)生不利影響。警告:過多地使用動態(tài)內(nèi)存會侵占 Visual FoxPro 緩沖、窗口、菜單等的內(nèi)存,并導(dǎo)致性能降低,因為滿足 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 程序中固有的檢驗。如果破壞了內(nèi)存,將會接受到“跨越句柄(Transgressed handle)”、“內(nèi)部一致性錯誤(Internal consistency err
37、or)” 和 “壓縮過程中跨越節(jié)點(diǎn)(Transgressed node during compaction)” 之類的信息。下面 FLL 庫中的函數(shù)舉例說明了內(nèi)存的分配。該示例使用 _RetDateStr( ) 返回了一個 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等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 水上救援車輛維修服務(wù)招投標(biāo)
- 城市升降機(jī)租賃協(xié)議樣本
- 農(nóng)業(yè)臨時用工管理技巧
- 村級衛(wèi)生機(jī)構(gòu)招聘合同范本
- 城市道路安全一級公路施工合同
- 福州學(xué)區(qū)房買賣合同要點(diǎn)解析
- 職務(wù)調(diào)整溝通與員工滿意度
- 地鐵站供暖設(shè)備安裝協(xié)議
- 2025復(fù)件 建設(shè)工程設(shè)計合同(2)工程文檔范本
- 企業(yè)成本控制與預(yù)算管理
- 數(shù)據(jù)中心電力設(shè)備調(diào)試方案
- 新入職員工年終工作總結(jié)課件
- 2024-2025學(xué)年高二上學(xué)期期末數(shù)學(xué)試卷(基礎(chǔ)篇)(含答案)
- 汽車吊籃使用專項施工方案
- 靜脈導(dǎo)管維護(hù)
- 普通邏輯學(xué)智慧樹知到期末考試答案章節(jié)答案2024年河海大學(xué)
- 帶你聽懂中國傳統(tǒng)音樂智慧樹知到期末考試答案2024年
- 外貿(mào)參展攻略
- 培養(yǎng)教育考察記實簿
- 化工工藝設(shè)計工藝管段表
- 工程作業(yè)活動風(fēng)險評價記錄表及分級管控清單【全面】
評論
0/150
提交評論