• 7051阅读
  • 3回复

哪位大侠能帮在下把这段Delphi代码转换成为BCB代码 [复制链接]

上一主题 下一主题
离线XChinux
 

只看楼主 倒序阅读 楼主  发表于: 2005-07-30
function GetHtml(const WebBrowser: TWebBrowser): string;
const
BufSize = $10000;
var
Size: Int64;
Stream: IStream;
hHTMLText: HGLOBAL;
psi: IPersistStreamInit;
begin
if not Assigned(WebBrowser.Document) then Exit;
OleCheck(WebBrowser.Document.QueryInterface (IPersistStreamInit, psi));
try
//OleCheck(psi.GetSizeMax(Size));
hHTMLText := GlobalAlloc(GPTR, BufSize);
if 0 = hHTMLText then RaiseLastWin32Error;
OleCheck(CreateStreamOnHGlobal(hHTMLText, True, Stream));
try
OleCheck(psi.Save(Stream, False));
Size := StrLen(PChar(hHTMLText));
SetLength(Result, Size);
CopyMemory(PChar(Result), Pointer(hHTMLText), Size);
finally
Stream := nil;
end;
finally
psi := nil;
end;
end;
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线XChinux

只看该作者 1楼 发表于: 2005-07-30
这是我写的,问题可能出在红色代码部分


AnsiString __fastcall TForm1::GetHtml(TCppWebBrowser *WebBrowser)
{
AnsiString strResult = "";
int BufSize = 10000;
IStream *Stream;
HGLOBAL hHTMLText;
IPersistStreamInit *psi;
if( WebBrowser->Document == NULL)
  return strResult;
OleCheck(WebBrowser->Document->QueryInterface(__uuidof(IPersistStreamInit), (void **)ψ));
try
{
  hHTMLText = GlobalAlloc(GPTR, BufSize);
  if( 0 == hHTMLText )
  {
    ShowMessage( "GlobalAlloc Error" );
    return strResult;
  }
  OleCheck(CreateStreamOnHGlobal(hHTMLText, true, &Stream));
  try
  {
    int Size;
    OleCheck(psi->Save(Stream, false));
    Size = strlen((char *)hHTMLText);
    char *tmp = new char[Size];
    CopyMemory(tmp, &hHTMLText, Size);
    strResult.sprintf("%s", tmp);
    delete[] tmp;

  }
  catch(...)
  {
    delete Stream;
    Stream = NULL;
  }
}
catch(...)
{
  delete psi;
  psi = NULL;
}
delete Stream;
delete psi;
return strResult;
}
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线XChinux

只看该作者 2楼 发表于: 2005-07-30
在CSDN上发了个帖子问,有大侠给解决了,现在贴出来,尽管我最终没有用BCB来做这个。
http://community.csdn.net/Expert/TopicView3.asp?id=3700435
Iframe Close: http://community.csdn.net/Expert/TopicView3.asp?id=3700435
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线XChinux

只看该作者 3楼 发表于: 2005-07-30
或者,贴过代码来:
 

呵呵,很懒拿你的改的

AnsiString __fastcall TForm1::GetHtml(TCppWebBrowser *WebBrowser)
{
_di_IDispatch disp;
System::DelphiInterface<IPersistStreamInit> psi;

AnsiString strResult = "";
int BufSize = 10000;
IStream *Stream;
HGLOBAL hHTMLText;
//IPersistStreamInit *psi;
if( WebBrowser->Document == NULL)
return strResult;
//OleCheck(WebBrowser->Document->QueryInterface(__uuidof(IPersistStreamInit), (void **)psi));
disp = WebBrowser->Document;
psi = disp;
//OleCheck(psi);
try
{
hHTMLText = GlobalAlloc(GPTR, BufSize);
if( 0 == hHTMLText )
{
ShowMessage( "GlobalAlloc Error" );
return strResult;
}
OleCheck(CreateStreamOnHGlobal(hHTMLText, true, &Stream));
try
{ ////////////////////// 问题主要出在这里
int Size;
OleCheck(psi->Save(Stream, false));
Size = strlen((char *)hHTMLText);
char *tmp = new char[Size];

char * pp = (char *)GlobalLock(hHTMLText); //注意这里几句,重要的是这里,你的全局内存是可移动的,先锁住
CopyMemory(tmp, pp, Size);
GlobalUnlock(hHTMLText); //解锁,看的真头疼,不过结果对了,自己释放资源哈~~~~~:)

strResult.sprintf("%s", tmp);
delete[] tmp;
///////////////////////////////////////////
}
catch(...)
{
//delete Stream;
Stream = NULL;
}
}
catch(...)
{
delete psi;
psi = NULL;
}
//delete Stream;
delete psi;
return strResult;
}
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
快速回复
限100 字节
 
上一个 下一个