в MSDN есть пример:
| Код | IHTMLDocument2 *document; // Declared earlier in the code HRESULT hresult = S_OK; VARIANT *param; SAFEARRAY *sfArray; BSTR bstr = SysAllocString(OLESTR("Written by IHTMLDocument2::write()."));
// Creates a new one-dimensional array sfArray = SafeArrayCreateVector(VT_VARIANT, 0, 1);
if (sfArray == NULL || document == NULL) { goto cleanup; }
hresult = SafeArrayAccessData(sfArray,(LPVOID*) & param); param->vt = VT_BSTR; param->bstrVal = bstr; hresult = SafeArrayUnaccessData(sfArray); hresult = document->write(sfArray);
cleanup: SysFreeString(bstr); if (sfArray != NULL) { SafeArrayDestroy(sfArray); }
|
на Delphi делаю так:
| Код | function GetHTMLDoc2FromString( const AStr: string ): IHTMLDocument2; var lSfArr: PSafeArray; lVar: PVariant; lWS: WideString; begin Result := CoHTMLDocument.Create as IHTMLDocument2; lSfArr := SafeArrayCreateVector(VT_VARIANT, 0, 1); if lSfArr <> nil then begin SafeArrayAccessData( lSfArr, Pointer(lVar) ); lWS := AStr; TVarData(lVar^).VType := VT_BSTR; TVarData(lVar^).VOleStr := @lWS[1]; SafeArrayUnaccessData( lSfArr ); Result.write(lSfArr); //SafeArrayDestroy(lSfArr); [U]<<- на этой строчке иногда вываливает AV, без нее все ок.но как тогда память освобождать?[/U] end; end;
|
подскажите, где косяк?! |