Если у вас есть что добавить к этим вопросам или новые вопросы, то шлите мне их сюда
1. Функция передаёт массив из СОМ компонента написанного на C++ в приложение на ASP.
[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;
}
наверх.
Пример:
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);
}
}
...
наверх.
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);
....
наверх.
identity impersonate="true" userName="registry:HKLM\Software\UEEE\Innm\ASPNET_SETREG,userName" password="registry:HKLM\Software\UEEE\Innm\ASPNET_SETREG,password"1) Не должно быть проблеа после запятой в обоих строчках - ....,userName и ....,password