正在向wxWebViewHandler注册协议
Registering a protocol with wxWebViewHandler
我目前正在尝试实现一个过度使用wxWebView的应用程序。我使用静态页面以及存储/缓存在用户电脑上的动态页面。对于应用程序,我希望使用两种方案/协议:
static://
和profile://
目标是让他们处理本地内容,但更容易处理这些内容。例如静态站点的翻译代码:
wxString Mainframe::GetStaticContent(wxString file)
{
// Choose based on language
wxString language = wxGetApp().GetSelectedLanguage();
// Construct Filename
wxFileName fname(wxGetApp().GetAppPath() + wxString("/static/") + language + wxString("/") + file + wxString(".html"));
// Return full path, which is corrected by wxWidgets
return fname.GetFullPath();
}
使用这个的url看起来是这样的:
static://start
现在我有一个从wxWebViewHandler派生的类来实现这一点:
class WebViewHandlerStatic : public wxWebViewHandler
{
public:
WebViewHandlerStatic(const wxString& protocol, Mainframe* parent)
: wxWebViewHandler(protocol), m_parent(parent)
{
m_fs = new wxFileSystem();
}
virtual WebViewHandlerStatic::~WebViewHandlerStatic()
{
wxDELETE(m_fs);
}
virtual wxFSFile* GetFile (const wxString &uri)
{
wxString content = uri.substr(9, uri.length()).BeforeLast('/');
wxString path = m_parent->GetStaticContent(content);
if ( wxFileName::FileExists(path) && wxFileSystem::HasHandlerForPath(path) )
{
//path = wxFileSystem::FileNameToURL(path);
return m_fs->OpenFile(path);
}
else
return NULL;
}
private:
Mainframe* m_parent;
wxFileSystem* m_fs;
};
然而,问题是如果我点击链接static://about或者任何其他协议,都不会发生任何事情。我尝试了使用和不使用FilenameToURL()。我还签入了调试器,路径在构造后是有效的。但是页面没有改变。
有人对此有任何见解吗?
编辑:
临时解决方案:
class WebViewHandlerStatic : public wxWebViewHandler
{
public:
WebViewHandlerStatic(const wxString& protocol, Mainframe* parent)
: wxWebViewHandler(protocol), m_parent(parent)
{
//m_fs = new wxFileSystem();
}
virtual WebViewHandlerStatic::~WebViewHandlerStatic()
{
//wxDELETE(m_fs);
}
virtual wxFSFile* GetFile (const wxString &uri)
{
wxString content = uri.substr(9, uri.length()).BeforeLast('/');
wxFileName path = m_parent->GetStaticContent(content);
wxString url = path.GetFullPath();
if ( wxFileSystem::HasHandlerForPath(url) )
{
m_parent->LoadURL(url);
// The content of url is in this state: "d:SourcewxSteamStatsbinstaticen_GBabout.html" (Copied from debugger)
}
return NULL;
}
private:
Mainframe* m_parent;
wxFileSystem* m_fs;
};
这毫无例外地完美无瑕。所以我真的不知道为什么这里需要wxFileSystem,也不知道它在里面是如何工作的。我看了组件的代码,但我不熟悉IE的API。对我来说,实际的文档似乎从未提供给IE。或者我必须将源代码"馈送"到控件的某个位置吗?我在wxArchiveWebHandler的源代码或示例中找不到类似的内容。
我刚刚使用下面的类对此进行了测试,该类对您的类进行了一些小的更改。
class WebViewHandlerStatic : public wxWebViewHandler
{
public:
WebViewHandlerStatic(const wxString& protocol) : wxWebViewHandler(protocol)
{
m_fs = new wxFileSystem();
}
virtual WebViewHandlerStatic::~WebViewHandlerStatic()
{
wxDELETE(m_fs);
}
virtual wxFSFile* GetFile (const wxString &uri)
{
wxFileName path = "C:/Users/Steven/Desktop/doc.htm";
wxString url = wxFileSystem::FileNameToURL(path);
if (wxFileSystem::HasHandlerForPath(url))
return m_fs->OpenFile(url);
else
return NULL;
}
private:
wxFileSystem* m_fs;
};
然后我按照样本中的另一个例子注册了它,它运行得很好。主要的区别在于,我使用wxFileSystem::FileNameToURL
,因为wxFileSystem需要一个URI,而不是文件路径。我怀疑,当您取消注释对它的调用时,当您传递wxString而不是wxFileName时,会发生一些不可靠的隐式转换。尝试从Mainframe::GetStaticContent
返回fname
,然后调用FileNameToURL
,希望它能起作用。
- 无法将结构注册为增强几何体3D点
- 如何使用AngelScript注册SFML Vector2运算符
- 如何在cpp.中使用协议缓冲区存储大缓冲区/数组(char/int)
- 在遍历处理程序的向量时注册和注销处理程序
- 如何使用url确定网站协议
- 有没有任务栏API可以立即应用注册表更改
- 使用QJsEngine在Qt中注册自定义类型
- 检查注册表项是否链接到(或副本)另一个注册表项
- MSYS2 MinGW程序包中缺少grpc_cpp_plugin协议
- 如何使用 TStyleManager::UnRegisterStyle() 取消注册样式
- 用CMake构建C++协议
- WINAPI 注册应用程序重新启动时不清除打开的套接字
- SFML 碰撞永远不会在我的系统中注册
- 尝试从C++访问 UWP 的电子邮件邮件类会导致"REGDB_E_CLASSNOTREG类未注册"错误
- 用于创建/注册虚拟存储设备的 IOKit 驱动程序
- 如何添加预防措施以绕过未注册Microsoft.ACE.OLEDB.12.0?
- 从原始字节解码协议缓冲区(以 C++为单位)
- 进程外 EXE 的免注册 COM
- 正在向wxWebViewHandler注册协议
- 在microtik Winbox的注册表编辑器中添加自定义协议