Вы можете обращаться к значениям переменных или полей 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; |