На главную.

Проблемы с которыми я сталкивался в процессе разработки программ.

Если у вас есть что добавить к этим вопросам или новые вопросы, то шлите мне их сюда

1. Функция передаёт массив из СОМ компонента написанного на C++ в приложение на ASP.

2. Как извлечь текст из документа с помощью интерфейса IFilter?

3. Как выделить целиком строку в CListCtrl (MFC)?

4. Имперсонация в web.config

Cтатьи, откуда я брал ответы.



1. Функция передаёт массив из СОМ компонента написанного на C++ в приложение на ASP.

Внимание!!!: ASP скрипт может получать безопасные массивы только c элементами типа VARIANT.
	
	[id(2), helpstring("method GetPositions")] HRESULT GetPositions([out,retval]VARIANT* ret_val);
	......

	STDMETHODIMP CFindWord::GetPositions(VARIANT* ret_val)
	{
		VariantInit( ret_val ); 
		ret_val->vt = VT_ARRAY | VT_VARIANT;
		SAFEARRAY *psa = NULL;
		SAFEARRAYBOUND bound;
		bound.cElements = Array_size;
		bound.lLbound = 0;
		psa = SafeArrayCreate(VT_VARIANT,1,&bound);
		
		VARIANT* VarArray; 
		 ::SafeArrayAccessData( psa, (void **) &VarArray ); 
		for(LONG i = 0; i < Array_size;i++){
			VarArray[i].vt = VT_I4; 
			VarArray[i].llVal = Ret_val[i];
		}
		SafeArrayUnaccessData( psa ); 

		ret_val->parray = psa;
		return S_OK;
	}

наверх.

2. Как извлечь текст из документа с помощью интерфейса IFilter?

Интерфейс IFilter извлекает текст из всех документов MSOffice, обычных текстовых файлов и HTML страниц, предварительно скачанных на компьютер. Если установить дополнительно pdf фильтр, то он будет работать с документами pdf. Текст из интернет сраниц выкачивается по тегам. 1 чанк (CHUNK) - 1 тег.
Пример:
	IFilterPtr filter = NULL;
	DWORD flags = 0; 	
        WCHAR awcBuffer[4097];
	CA2W fn(filename);
	hr = LoadIFilter(fn.m_psz,NULL,(void**)&filter); 
	if(filter == NULL){
		return;
	}
	try {
		hr = filter->Init(0,0,0,&flags); 
	} catch(_com_error &e){
		return;
	}
	if (SUCCEEDED(hr)) { 
	  STAT_CHUNK stat; 
	   do{ 
		hr = filter->GetChunk(&stat); 
		if (SUCCEEDED(hr)&& (stat.flags == CHUNK_TEXT)) { 
		 	HRESULT state_text = 0; 
			do{	
				ULONG bufsize=4096; 
				state_text = filter->GetText((ULONG*)&bufsize,awcBuffer);
				awcBuffer[bufsize] = 0;
				mStream->WriteText(awcBuffer,ADODB::adWriteChar);
			}while((state_text != FILTER_S_LAST_TEXT)&&
				   (state_text != FILTER_E_NO_MORE_TEXT)&&
				   (state_text != FILTER_E_NO_TEXT)); 
		 } 

	  }while(FILTER_E_END_OF_CHUNKS != hr);
	}
Для того чтоб достать из html документа определённые теги следует в функции IFilter::Init первый параметр выставить как IFILTER_INIT_APPLY_INDEX_ATTRIBUTES. Далее, метод GetChunk(&stat) будет возвращать текст, который содержится в теге, а в поле stat.attribute.psProperty будет идентификатор тега. Причём тег будет либо помечен определённым ID, либо строкой с определённым именем. Кроме того, весь текст видимый на экране будет обязательно отображён под ID = 0x13(Contents).
Пример (требуется получить текст, который не является ссылкой и не Title):
	...
	hr = LoadIFilter(fn.m_psz,NULL,(void**)&filter); 
	if(filter == NULL){
		return;
	}
	try {
		hr = filter->Init( IFILTER_INIT_APPLY_INDEX_ATTRIBUTES,0,0,&flags); 
	} catch(_com_error &e){
		return;
	}
	if (SUCCEEDED(hr)) { 
	  STAT_CHUNK stat; 
	  PROPID oldstat = 0;
	  bool href = false;
	  do{ 
			hr = filter->GetChunk(&stat); 
			if(stat.attribute.psProperty.propid != 0x13){
			oldstat = stat.attribute.psProperty.propid;
			if(stat.attribute.psProperty.ulKind == 0){
				if(memcmp(stat.attribute.psProperty.lpwstr,L"A.HREF",6*sizeof(OLECHAR)) == 0) href = true;
			} else {
				href = false;
			}
			continue;
		}
		if (SUCCEEDED(hr)&& (stat.flags == CHUNK_TEXT)) { 
		 	HRESULT state_text = 0; 
			BOOL title_flag = false;
            do{	
				ULONG bufsize=4096; 
				state_text = filter->GetText((ULONG*)&bufsize,awcBuffer);
				awcBuffer[bufsize] = 0;
					if((oldstat != 0x02) && !href) {
						if(awcBuffer2[0] != 0){
							mStream->WriteText(awcBuffer2,ADODB::adWriteChar);
						}
					}
				wmemcpy(awcBuffer2,awcBuffer,bufsize+1);
			}while((state_text != FILTER_S_LAST_TEXT)&&
				   (state_text != FILTER_E_NO_MORE_TEXT)&&
				   (state_text != FILTER_E_NO_TEXT)); 
			oldstat = stat.attribute.psProperty.propid;	
			href = false;
		} 
	  }while(FILTER_E_END_OF_CHUNKS != hr);
		if(oldstat == 0x13){
				if(awcBuffer2[0] != 0) mStream->WriteText(awcBuffer2,ADODB::adWriteChar);
		}
	}
	...
наверх.

3. Как выделить целиком строку в CListCtrl (MFC)?

Чтобы выделить строку в CListCtrl необходимо вставить следующие строки в DoDataExchange(CDataExchange* pDX):
	CListCtrl Sites_list;
	....
	DDX_Control(pDX, IDC_LIST1, Sites_list);
	Sites_list.InsertColumn(0,_T("Rule"),LVCFMT_LEFT,50);
	Sites_list.InsertColumn(1,_T("Site"),LVCFMT_LEFT,150);

	DWORD ExStyle = Sites_list.GetExtendedStyle();
	ExStyle |= LVS_EX_FULLROWSELECT;
	Sites_list.SetExtendedStyle(ExStyle);
	....
наверх.

4. Имперсонация в web.config

  identity impersonate="true" 
userName="registry:HKLM\Software\UEEE\Innm\ASPNET_SETREG,userName" 
password="registry:HKLM\Software\UEEE\Innm\ASPNET_SETREG,password" 
1) Не должно быть проблеа после запятой в обоих строчках - ....,userName и ....,password
2) Зайти в реестр и на папке реестра "ASPNET_SETREG" правой кнопкой, там ptrmission - в нём дать разрешение на четние для NETWORK_SERVICE

Cтатьи, откуда я брал ответы.

Returning Safe Arrays from ASP Components By Peter Persits Copyright (c) 1999 Persits Software, Inc.
MSDN

наверх.
Hosted by uCoz