Вы можете обращаться к значениям переменных или полей Visual FoxPro в ваших элементах ActiveX или FLL функции, как для чтения их, так и для установки. В дополнение к этому, вы можете создавать новые переменные, которые могут быть доступны из Visual FoxPro.
Переменные и поля сделаны в Visual FoxPro доступными через таблицу имен, которая представляет собой массив, содержащий имена всех текущих определенных переменных и полей. Вы можете обращаться к индивидуальным элементам в массиве используя индекс таблицы имен (NTI). Специальная функция API, _NameTableIndex(), возвращает индекс существующей переменной или поля, на основе предоставленного вами имени. После того, как вы определите NTI для данной переменной, вы можете прочитать ее с помощью API функции _Load() или установить ее значение с помощью API функции _Store( ). Для создания новой переменной вы можете вызвать API функцию _NewVar().
Для обращения к переменным или полям Visual FoxPro, вы используете структуры Value м Locator, определенные в файле Pro_ext.h. Если вы создаете FLL-библиотеку, вы можете использовать те же самые способы, которые вы используете для обращения к параметрам, посланным в ваши функции. За более подробной информацией о структурах Value и Locator обратитесь к описанию Параметры во внешних библиотеках.
Приведенный ниже пример иллюстрирует, каким образом вы можете использовать структуры Value и Locator в элементе ActiveX для доступа к переменным Visual FoxPro.
Скопировать
код | |
|---|---|
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; | |