你有一两个网页吧?纷歧定是何等奇异的工具,但一个经过几个HTML标签作出的简练的演示就能够。你有一个需求远程把持的庞杂的C++ Windows 桌面使用顺序吧?所以,不需求进修一个全新的技巧,让我们一同为您的使用添加WEB页面吧。
Webem是一个可以嵌入你的C++使用顺序的WEBServer。它可以轻松地完成一个从任何地方都能拜访的阅读器GUI。
Webem基于一个简化版的boost::asio WEBServer,它可让HTML代码履行C++办法。虽然你不需求检查Server代码来运用Webem,但你需求为你的工程下载和运用BOOST库。我建议假如你从未运用过BOOST,那Webem可能不合适你。
其它翻译版本 (1) 加载中现有的嵌入式C++ webServer运用起来是一个应战,而且有不合错误Windows友好的趋向. 它们也不是你想要用来为你的试验性使用顺序参加可以用手机实行监控的才能的那种工具.
我测验考试过 (http://www.webtoolkit.eu/wt) ,但在装置和进修中挫败了.
比来我Start运用John Bartas的Webio. 我喜欢其理念,它也运作的很好.
但是,我依然发明它在运用时过于庞杂,而且办事端代码也难于了解. 我想要的是一个轻易运用,基于一个着名webServer,只做了细微修正的好东东.
Webio的很多庞杂性是有运用一个HTML编译器来暗藏把持着嵌入于使用顺序代码外面的文件系统的外观的HTML页面所酿成的. 我更爱好将HTML页面放在内部一个凡是的视图中,那样我就能够不必从头编译顺序,却可以调剂GUI.
我在测验考试调剂Webio以契合本人爱好的过程当中了解了非常多, 终极决议预备去构建一个能实在知足我本人的需求的工具.
你可以像树立网站一样来树立的你使用顺序GUI-从index.htmlStart运用HTML新建页面。
如今你需求使HTML挪用你的C++办法。你需求做以下三件事:
创立被包括在WEB页面里的能生成HTML的include(包括)办法。
创立当用户点击WEB页面里的按钮时被webem挪用的action(举措)办法。它们可所以容易的按钮,或html表单。
创立"web控件",即上面两个的组合,一个include办法生成表单,当用户点击按钮时这个表单会挪用action办法-示例顺序"Calendar"展现了怎么创立一个显示和更新数据表的控件。
第一步:新建web页面。你可以随你爱好将页面设计的很经心,可是关于我们的第一个“hello,world”使用,页面固然是越容易越好:
The Webem Embedded Web server says: <!--#webem hello -->
在尖括号中的文本通知webem在使用中那边将文本包括出去,“hello”则是指定的使用办法,必须被挪用来供给包括的文本。
第二步:新建类,该类前往“hello”:
/// An application class which says hello class cHello { public: char * DisplayHTML() { return "Hello World"; } };
第三步:初始化wenem,设置装备摆设端口和地址来监听阅读器恳求而且去找到index.html作为web页面的首页。
// Initialize web server. http::server::cWebem theServer( "0.0.0.0", // address "1570", // port "."); // document root
第四步:用webem注册使用办法:
cHello hello; // register application method // Whenever server sees <!--#webem hello --> // call cHello::DisplayHTML() and include the HTML returned theServer.RegisterIncludeCode( "hello", boost::bind( &cHello::DisplayHTML, // member function &hello ) ); // instance of class
第五步:最初,你曾经预备好了启动办事。
// run the server theServer.Run();其它翻译版本 (2) 加载中
让我们来创立一个更儒雅的顺序,可经过姓名(如CodeProject,Canadian)来定位收集。
第一步:新建站点:
What is your name, please? <form action=name.webem> <input name=yourname /><input value="Enter" type=submit /> </form> The Webem Embedded Web server says: <!--#webem hello -->
该表单供给一个文本域,可使用户输出姓名。别的另有一个提交按钮将姓名提交给Server。表单属性“action=name.webem”确保webemServer会挪用使用经过“name”注册的办法来处置输出。
第二步:创立使用类:
/// An application class which says hello to the identified user class cHelloForm { string UserName; http::server::cWebem& myWebem; public: cHelloForm( http::server::cWebem& webem ) : myWebem( webem ) { myWebem.RegisterIncludeCode( "hello", boost::bind( &cHelloForm::DisplayHTML, // member function this ) ); // instance of class myWebem.RegisterActionCode( "name", boost::bind( &cHelloForm::Action, // member function this ) ); // instance of class } char * DisplayHTML() { static char buf[1000]; if( UserName.length() ) sprintf_s( buf, 999, "Hello, %s", UserName.c_str() ); else buf[0] = ' '; return buf; } char * Action() { UserName = myWebem.FindValue("yourname"); return "/index.html"; } };其它翻译版本 (1) 加载中
这个类存储了对webemServer的援用. 它答应在其构建时保护对其本身办法的注册, 并挪用cWebem类的FindValue()来提取输出表单域中的值.
这个类需求注册两个办法,一个在表单提交时保管输出的用户名,一个用来在页面被组合起来发送给阅读器时展现被存储的用户称号.
举措办法必需前往要在提交按钮点击呼应中展现的web页面.
留意一切的举措办法都是有Webem在包括办法之前挪用的,所以web页面老是会展现更新了的数据.
第三步:构建webem,构建使用类并启动Server:
// Initialize web server http::server::cWebem theServer( "0.0.0.0", // address "1570", // port "."); // document root // Initialize application code cHelloForm hello( theServer ); // run the server theServer.Run();
你可能需求在其他线程中启动Server,如许你使用可以继续在试验室安装中记载日记数据。为了做到这一点,更改对server::run的挪用:
boost::thread* pThread = new boost::thread( boost::bind( &http::server::server::run, // member function &theServer ) ); // instance of class其它翻译版本 (1) 加载中
Webem控件是以规范方法监督显示和操纵使用数据的细节的类,所以使用顺序开发者不需求存眷生成HTML文本的一切细节。
示例顺序运用一个webem来列出一个SQLITE数据表的一切内容,且供给了添加和删除记载的才能。在本文的Start是它的截图。
其它翻译版本 (1) 加载中Webem 支撑 Unicode 使用顺序包括功用, 这意味着你的代码可以生成和展现中文, 西里尔语,乃至是克灵贡字符. 编写一个前往广泛的字符串UTF-16编码的包括函数, 并运用RegisterIncludeCodeW() 函数 ( 而不是RegisterIncludeCode() ) 来将其注册,Webem就会在将其发送到阅读器之前先转换成UTF-8 编码:
class cHello { public: /** Hello to the wide world, returning a wide character UTF-32 encoded string with chinese characters */ wchar_t * DisplayWWHello() { return L"Hello Wide World. Here are some chinese characters: x751fx4ea7x8bbex7f6e"; } }; ... theServer.RegisterIncludeCodeW( "wwwhello", boost::bind( &cHello::DisplayWWHello, // member function &hello ) ); // instance of class
假如你想要晓得为何UTF-8和UTF-16是需要的,你看我的一篇博文 举世编码.
容易的按钮举措
有时你可能需求在用户点击一个按钮时运转一个举措,可是你其实不需求传入任何参数。这类状况要设置一个表单看起来有点太费事,而且也限制了你可以展现的方式。因而我增加了一个点击举措恳求.
假如你将下面这个工具参加你的htm文件
<a href="http:/index.html/webem_name">button_label</a>
那末当用户点击"button_label"时,webem就会挪用注册到"name"上的函数并在index.html实行展现.
本文中的一切译文仅用于进修和交换目标,转载请务必注明文章译者、出处、和本文链接。 2KB翻译任务按照 CC 协议,假如我们的任务有进犯到您的权益,请实时联络我们。2KB项目(www.2kb.com,源码交易平台),提供担保交易、源码交易、虚拟商品、在家创业、在线创业、任务交易、网站设计、软件设计、网络兼职、站长交易、域名交易、链接买卖、网站交易、广告买卖、站长培训、建站美工等服务