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

 CopyCode imageСкопировать код
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;

Смотрите также