Zugriff auf Visual FoxPro-Variablen und -Felder
Sie können aus Ihrem ActiveX-Steuerelement oder Ihrer FLL-Funktion auf Visual FoxPro-Variablen oder -Felder zugreifen, um diese entweder zu lesen oder einzustellen. Außerdem können Sie neue Variablen erstellen, auf die aus Visual FoxPro heraus zugegriffen werden kann.
Variablen und Felder werden in Visual FoxPro in einer Namenstabelle zur Verfügung gestellt, die ein Array ist, das die Namen aller momentan definierten Variablen und Felder enthält. Auf ein bestimmtes Element des Arrays können Sie mit dem Namenstabellenindex (NTI) zugreifen. Die API-Funktion _NameTableIndex( ) gibt anhand eines von Ihnen angegebenen Namens den Index der zugehörigen Variablen oder des zugehörigen Feldes zurück. Nachdem Sie den NTI einer Variablen ermittelt haben, können Sie deren Wert mit der API-Funktion _LOAD( ) lesen oder mit der API-Funktion _STORE( ) einstellen. Wenn Sie eine neue Variable erstellen möchten, rufen Sie die API-Funktion _NewVar( ) auf.
Um auf Visual FoxPro-Variablen oder -Felder zuzugreifen, verwenden Sie die Strukturen Value und Locator, die in Pro_ext.h definiert sind. Wenn Sie eine FLL-Bibliothek erstellen, können Sie dieselben Vorgehensweisen verwenden, mit denen Sie auf Parameter zugreifen, die an Ihre Funktionen übergeben werden. Weitere Informationen zu den Strukturen Value und Locator finden Sie unter Übergeben und Empfangen von Parametern.
Das folgende Beispiel stammt aus dem Programm Foxtlibctl.cpp, das Sie im Verzeichnis Microsoft Visual FoxPro 7\Samples\API\FoxTLib finden. Dieses Beispiel verdeutlicht, wie Sie die Strukturen Value und Locator in einem ActiveX-Steuerelement verwenden können, um auf Visual FoxPro-Variablen zuzugreifen:
long CFoxtlibCtrl::TLGetTypeAttr(long pTypeInfo, LPCTSTR szArrName)
{
int nResult = 1;
TYPEATTR *lpTypeAttr;
Locator loc;
Value val;
OLECHAR szGuid[128];
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
StringFromGUID2(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_length);
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) -> ReleaseTypeAttr(lpTypeAttr);
}
} __except (EXCEPTION_EXECUTE_HANDLER) {
nResult = 0;
}
return nResult;
Siehe auch
Übergeben von Parametern an Visual FoxPro-API-Funktionen | Verwalten des Arbeitsspeichers | Zugreifen auf die Visual FoxPro-API | Erweitern von Visual FoxPro mit externen Bibliotheken | Erstellen und Debuggen von Bibliotheken und ActiveX-Steuerelementen | _NameTableIndex( )