webbrowser 2个问题100分,谢谢。

slmxy 2010-05-06 09:05:44
一、怎么把webbrowser的OnDocumentComplete事件 在程序运行时,指向别的自定义函数 myoncomp()
我把myoncomp函数做的和OnDocumentComplete格式一样。
web1->OnDocumentComplete="myoncomp" 不行。
web1->OnDocumentComplete=myoncomp 也不行。
二、我想把CComvariant.pbstrval保存到一个文本文件中。CComvariant里面好多类型的值,我只想要CComvariant.pbstrval中的,我想应该是字符串数组吧?我不知道。BSTR * mystring=CComvariant.pbstrval我试过,调试时能看到mystring中有数据。但我不知道如何将其读成string,或直接保存为文本文件。
...全文
253 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
ccrun.com 2010-07-03
  • 打赏
  • 举报
回复
既然读到网页的字符集编码为GB2312,返回的当然是GB2312编码的字符串.
slmxy 2010-05-08
  • 打赏
  • 举报
回复
哥俩说的,我都试了,还是乱码。
我读的网页的charset="gb2312"
返回的是utf-8的吗?
ccrun.com 2010-05-08
  • 打赏
  • 举报
回复
用Utf8ToAnsi函数转换一下。
柯本 2010-05-08
  • 打赏
  • 举报
回复
那是utf-8的,手边没有bcb2010,你可以试试
UTF8String x=cv.pcVal;
WideString y=UTF8Decode(x);
ShowMessage(y);
slmxy 2010-05-08
  • 打赏
  • 举报
回复
我用BSTR得到了数据。全是乱码。
我读的网页的charset="gb2312"
我在网上找的读取网页数据是乱码的解决办法。是C#的,谁能告诉我BCB怎么用。
C#的代码是:
Encoding encoding = Encoding.GetEncoding("utf-8");
reader = new StreamReader(stream, encoding);
slmxy 2010-05-07
  • 打赏
  • 举报
回复
(keiy)兄的 精华推荐:BCB在COM中如何处理javascript脚本传递的数组
我就是用这篇文章里写的方法,读javascript的数组。BCB的资料真少。唉!
slmxy 2010-05-07
  • 打赏
  • 举报
回复
第一个问题解决了。
我用的是bcb2010,新手,(keiy) 的web1->OnDocumentComplete=myoncomp;我试了,不行。不知道为什么。
妖哥的好使。我用的是web1->OnDocumentComplete=(TWebBrowserDocumentComplete)&my_on,my_on是用bcb自动生成的事件函数改的。十分感谢。

第二个问题谁帮整整。
我再从说一下吧:

过程:我用webbrowser 打开了一个网页,用disp->Invoke 读出了网页中javascript的变量,(我估计是读出来了,调试时我看了一下,里面有数据),变量中有一个我想要的数组。

目的:读出的数据类型为CComVariant,名为lv,其中lv.pbstrVal中有数据,我估计是我想要的数组,我想把lv.pbstrVal转换成字符串数组。并存到txt文件中。谁帮整整。十分感谢。

柯本 2010-05-07
  • 打赏
  • 举报
回复
如果用cv.bstrVal可以读到,但是乱码,那可能的问题是它不是unicode代码,而是AnisString的
那就试试:
AnsiString x=cv.pcVal;
将它赋给一个AnsiString的变量

slmxy 2010-05-07
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 keiy 的回复:]
直接用cv.bstrVal不行吗?按理可以用的,而pbstrVal是指向wchar_t*的指针.
实在不行试试强制转换(编译应该能通过,就看能否得到数据)
(wchar_t*)cv.pbstrVal;
或试试
*cv.pbstrVal;
[/Quote]
用cv.bstrVal只出了三个汉字,是乱码。
我的程序里的cv.pbstrVal 存的应该是网面上的所有javascript 变量。
怎么才能把这些变量读出来呢?
柯本 2010-05-07
  • 打赏
  • 举报
回复
直接用cv.bstrVal不行吗?按理可以用的,而pbstrVal是指向wchar_t*的指针.
实在不行试试强制转换(编译应该能通过,就看能否得到数据)
(wchar_t*)cv.pbstrVal;
或试试
*cv.pbstrVal;

slmxy 2010-05-07
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 ccrun 的回复:]
对于将CComVariant类型的字符串数据写到文件中,我给你个最简单的例子:
[/Quote]
我要的数据应该在cv.pbstrVal里,我查了,好像是指针数组什么的。不是cv.bstrVal的。
我按你说的把cv.pbstrVal换上了,提示
Cannot convert 'wchar_t **' to 'const wchar_t*'
Type mismatch in parameter '__s'(wanted'const wchar_t*',got 'wchar_t **)
ccrun.com 2010-05-07
  • 打赏
  • 举报
回复
对于将CComVariant类型的字符串数据写到文件中,我给你个最简单的例子:

#include <atl/atlbase.h>

void __fastcall TForm1::FormCreate(TObject *Sender)
{
CComVariant cv("test好啊ccrun");

TMemoryStream *ms = new TMemoryStream;

// 先将BOM文件头写入
char szBom[2] = { 0xFF, 0xFE };
ms->Write(szBom, 2);

// CComVariant中的字符串数据
ms->Write(cv.bstrVal, wcslen(cv.bstrVal) * sizeof(wchar_t));

// 保存至文件
ms->SaveToFile("D:\\ccrun\\123.txt");

delete ms;
}
iqyely 2010-05-06
  • 打赏
  • 举报
回复
学习了。
ccrun.com 2010-05-06
  • 打赏
  • 举报
回复
VCL类的事件处理函数,必须是一个类成员函数。当然,也可以是自定义类。举个简单例子:
.h中声明:
class TTest
{
public:
void __fastcall ButtonClick(TObject *Sender)
{
ShowMessage("按钮被点击");
}
};

//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
TButton *Button1;
private: // User declarations
TTest t;
public: // User declarations
__fastcall TForm1(TComponent* Owner);
};


.cpp中:
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
Button1->OnClick = (TNotifyEvent)&t.ButtonClick;
}


这样当程序运行后,点击Button时,就会调用Test类的ButtonClick方法。

在楼主的这个问题中,你需要定义一个OnDocumentComplete事件的处理函数,当然,必须是某个类的成员函数,例如:
class Test
{
public:
void __fastcall CwbOnDocumentComplete(TObject *Sender,
LPDISPATCH pDisp, Variant *URL)
{
//... 为省事,我将该函数的实现放在了这里。
}
};
然后指定CppWebBrowser的OnDocumentComplete事件:
CppWebBrowser1->OnDocumentComplete = (TCppWebBrowserDocumentComplete)&t.CwbOnDocumentComplete;

这样就可以了。
柯本 2010-05-06
  • 打赏
  • 举报
回复
第二个问题,要看你的CComVariant实际返回值,你可试试以下二种
1)
CComVariant p;
AnsiString x=p.pcVal;
2)
CComVariant p;
WideString y=p.bstrVal;
柯本 2010-05-06
  • 打赏
  • 举报
回复
第1个问题
1)首先你要将myoncomp定义在Form类中,如:
class TForm1 : public TForm
{
...
public: // User declarations
__fastcall TForm1(TComponent* Owner);
void __fastcall myoncomp(TObject *Sender,LPDISPATCH pDisp, tagVARIANT *URL) ;
};
2)实现:
void __fastcall TForm1::myoncomp(TObject *Sender,
LPDISPATCH pDisp, tagVARIANT *URL)
{
//你的程序
}
3)赋值:
web1->OnDocumentComplete=myoncomp;
以上测试在BCB6中通过

1,317

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧