谁把左轻候这段delphi代码改写成C++Builder的!!!(100分)

  • 主题发起人 wyb_star
  • 开始时间
W

wyb_star

Unregistered / Unconfirmed
GUEST, unregistred user!
这是左轻候离线浏览器中的一段代码,谁能帮我改写成C++Builder的。
procedure TfrmMain.ShowHtml(Browser:TWebBrowser;content: string);
var
vv: Variant;
HTMLDocument: IHTMLDocument2;
begin
vv := VarArrayCreate([0,0],varVariant);
vv[0] := content;
HTMLDocument := browser.Document as IHTMLDocument2;
HTMLDocument.write(PSafeArray(TVarData(vv).VArray));
HTMLDocument.charset := 'gb2312';
HTMLDocument.close;

end;
 
叫左轻候来看看。
 
急急急急。。。。。。。。。。。。。。。。。。。
 
http://delphi.itschem.com,左轻候的站点
 
我也不会……
在Delphi里泡太久了,C++都忘啦:-(
问yysun试试,他应该会
 
哪位来帮帮我?
 
void __fastcall TfrmMain->ShowHtml(TWebBrowser Browser,AnsiString content);
{
Variant vv ;
int Bounds[2] = {0,0};
IHTMLDocument2 HTMLDocument ;

vv = VarArrayCreate(Bounds,varVariant);
vv[0] = content;
HTMLDocument = Browser->Document as IHTMLDocument2;
HTMLDocument->Write(PSafeArray(TVarData(vv)->VArray));
HTMLDocument->Charset = 'gb2312';
HTMLDocument->Close();

}
没有严格调试, 可能还有错, sorry

 
那段程序的功能是: 把字符串直接写入 WebBrowser 控件, 不用写入临时文件再读入.
实现的核心思想可以拆解为:

1.根据 WebBrowser 控件获得 IHTMLDocument2 接口
Delphi 中的:
HTMLDocument := browser.Document as IHTMLDocument2;
C++ 要用 QueryInterface 来获取:
IHTMLDocument2 *document = NULL;
if(SUCCEEDED(CppWebBrowser->Document->QueryInterface(IID_IHTMLDocument2, &document))){
// 成功的话, 继续下一步 ...
}

2.创建 IHTMLDocument2 接口之 write 函数需要的 SafeArray 类型
Delphi 中的:
vv := VarArrayCreate([0,0],varVariant);
vv[0] = content;
C++ 要用:
HRESULT hresult = S_OK;
VARIANT *param;
SAFEARRAY *sfArray;
BSTR bstr = SysAllocString(OLESTR(content));
// Creates a new one-dimensional array
sfArray = SafeArrayCreateVector(VT_VARIANT, 0, 1);
hresult = SafeArrayAccessData(sfArray,(LPVOID*) & param);
param->vt = VT_BSTR;
param->bstrVal = bstr;
hresult = SafeArrayUnaccessData(sfArray);

3.写入
Delphi 中的:
HTMLDocument.write(PSafeArray(TVarData(vv).VArray));
C++ 要用:
hresult = document->write(sfArray);

4.擦屁股
Delphi 中的:
HTMLDocument.close;
vv := Unassigned;
C++ 要用:
hresult = document->close();
SysFreeString(bstr);
if (sfArray != NULL) SafeArrayDestroy(sfArray);

5.根据上面的原理, 您自己就可以做
void ShowHtml(TCppWebBrowser *CppWebBrowser, String content) {
//就当考试吧
//祝您成功!
}
 
谢谢各位的参与,特别谢谢孙老师的详细讲解,已经各行解决,结果如下:
void TMainFrm::ShowHtml(TCppWebBrowser *Browser,AnsiString content,int ID)
{
WideString wContent = content;
IHTMLDocument2* pDoc;
HRESULT hr;
VARIANT *vv;
SAFEARRAY *sfArray;
sfArray = SafeArrayCreateVector(VT_VARIANT, 0, 1);
SafeArrayAccessData(sfArray, (LPVOID*)&vv);
vv->vt = VT_BSTR;
vv->bstrVal = wContent.c_bstr();
SafeArrayUnaccessData(sfArray);
hr = Browser->Document->QueryInterface(IID_IHTMLDocument2, (void**)&pDoc);
if (hr == S_OK)
{
pDoc->write(sfArray);
pDoc->put_charset(WideString("gb2312"));
pDoc->close();
}
}
 
更简单的写法如下:
void TMainFrm::ShowHtml(TCppWebBrowser *Browser,AnsiString content)
{
Variant vv;
IHTMLDocument2 *HTMLDocument;
int Bounds[2] = {0,0};
vv = VarArrayCreate(Bounds,1,varVariant);
vv.PutElement(content,0);

Browser->Document->QueryInterface(IID_IHTMLDocument2, (void**)&HTMLDocument);
HTMLDocument->write((tagSAFEARRAY *)vv.VArray);
HTMLDocument->put_charset(WideString("gb2312"));
HTMLDocument->close();
}
 
多人接受答案了。
 
var
HTMLDocument: IHTMLDocument2 //这里编译失败
 
加mshtml头文件
 
顶部