<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>空雪小屋 &#187; 问题解决</title>
	<atom:link href="http://blog.sorayuki.net/?cat=15&#038;feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://blog.sorayuki.net</link>
	<description>现在域名是 blog.sorayuki.net ~</description>
	<lastBuildDate>Tue, 29 Nov 2022 08:27:41 +0000</lastBuildDate>
	<language>zh-CN</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=4.0</generator>
	<item>
		<title>使用VS2022编译7zip的控制台程序</title>
		<link>http://blog.sorayuki.net/?p=651</link>
		<comments>http://blog.sorayuki.net/?p=651#comments</comments>
		<pubDate>Tue, 29 Nov 2022 07:58:52 +0000</pubDate>
		<dc:creator><![CDATA[空雪梦见]]></dc:creator>
				<category><![CDATA[VC]]></category>
		<category><![CDATA[Windows编程]]></category>
		<category><![CDATA[问题解决]]></category>

		<guid isPermaLink="false">http://blog.sorayuki.net/?p=651</guid>
		<description><![CDATA[7zip除了官方下载安装的图形界面工具之外，是有独立控制台程序的，在CPP\7zip\Bundles里面。这个 &#8230; <a href="http://blog.sorayuki.net/?p=651" class="more-link">继续阅读<span class="screen-reader-text">使用VS2022编译7zip的控制台程序</span> <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>7zip除了官方下载安装的图形界面工具之外，是有独立控制台程序的，在CPP\7zip\Bundles里面。这个控制台程序还分为全功能版（7zz）的和精简的（7zr），但官方那边能下载到的只有精简的，全功能的那个要自己编译。</p>
<p>在用VS2022编译全功能版的时候我遇到了问题。虽然官方提供了nmake用的编译脚本，但是它跑起来总是报错，而且报错的地方在Windows SDK里面、而不是7z自己的代码。报的错误是C2279，出现在mapi.h头文件里、诸如“这个typedef地方不能写throw标识符”这样的东西。</p>
<p>网上搜索之后能找到的相关的东西不太多，有一个说法是C++标准的问题，现在的Windows SDK需要配合新版本的C++标准（C++17之类）才能正常使用。看了一下7zip源码里nmake脚本加的参数，也确实没有指定标准。</p>
<p>本来想试试换个旧版的Windows SDK行不行，一看要下载那么多东西……烦了，就没试。最后我的做法是，<span style="color: #ff0000;">打开CPP下的Build.mk，找到定义 CFLAGS 的那一行，加个 /std:c++17</span>。文件是只读的，要去掉只读属性才能保存。再编译会变成另外的错误，报异常规范不匹配。最简单的<span style="color: #ff0000;">去掉警告视为错误（搜索，去掉-WX）</span>可以编译通过。</p>
<p>另外我发现它没加链接时代码生成这样的优化，暂时不知道为什么。试着开了一下，用7zz b看跑分，和不开看不出区别。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.sorayuki.net/?feed=rss2&#038;p=651</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>FFMS2读取多媒体文件中的声音的Bug</title>
		<link>http://blog.sorayuki.net/?p=623</link>
		<comments>http://blog.sorayuki.net/?p=623#comments</comments>
		<pubDate>Mon, 28 Aug 2017 15:10:08 +0000</pubDate>
		<dc:creator><![CDATA[空雪梦见]]></dc:creator>
				<category><![CDATA[多媒体]]></category>
		<category><![CDATA[程序设计]]></category>
		<category><![CDATA[问题解决]]></category>

		<guid isPermaLink="false">http://blog.sorayuki.net/?p=623</guid>
		<description><![CDATA[FFMS2是AviSynth的一个来源插件，以FFMPEG为支撑，能读入各种各样的多媒体文件。但是今天在使用它 &#8230; <a href="http://blog.sorayuki.net/?p=623" class="more-link">继续阅读<span class="screen-reader-text">FFMS2读取多媒体文件中的声音的Bug</span> <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>FFMS2是AviSynth的一个来源插件，以FFMPEG为支撑，能读入各种各样的多媒体文件。但是今天在使用它的时候，遇到了Bug。</p>
<p><span id="more-623"></span>
<p>这个Bug的具体表现是，如果我有一个MP4视频文件，我用某些切割工具对文件进行过切割，因为切割的时候不一定是在关键帧处切割的，而切割过程中又没有重新进行编码，有的工具在这样切割之后生成的文件，音频和视频的第一帧（关键帧）的时间戳都是小于0。小于一点点貌似没事，我遇到Bug的时候，这个时间戳我记得是负的4秒多。</p>
<p>对于这样的文件，我再用FFMS2在AviSynth里载入（记得要包含声音），载入之后用类似 last+last 这样的语句把它们连接起来。这样的AviSynth脚本送到播放器里面播放的话，到了两个片段的连接处，就会发现播放器死了。不是概率性出现而是每次必现。</p>
<p>我从GitHub下载了FFMS2的源代码（<a title="https://github.com/FFMS/ffms2" href="https://github.com/FFMS/ffms2">https://github.com/FFMS/ffms2</a>），在MSYS2环境中执行它那个 build-win-deps.sh 下载 ffmpeg 和编译（因为opencore-amr我用不到，为了节省时间，我就把它注释和屏蔽掉了）。之后用 VisualStudio 打开它那个工程，编译了FFMS2.dll。不论是Debug版本还是Release版本，自己编译的也还是会出现同样的问题。</p>
<p>但是因为是自己编译的，所以用 Debug 版本调试起来就很方便。在卡死的时候中断程序运行，会发现卡死的代码在 audiosource.cpp 的 FFMS_AudioSource::GetAudio 函数里。它不断在一个循环里打转，也不进什么函数，也不出去。很是郁闷。</p>
<p>我重新运行了程序，试图在它将要变成这个样子的临界点用条件断点（判断 Start 变量的值）断了下来。跟踪跟进去，发现和正常的时候相比，此时有个地方不太一样：它在正常的时候，是在数据不够的时候进 DecodeNextBlock 函数，然后 avcodec_decode_audio4 解码一个包，把解码结果 cache 起来。但是在我刚才所说的情况中，因为进了下一个片段，它会先 Seek 当前进度到文件开头，然后再调用 DecodeNextBlock。我观察到的结果是，它还没 Seek 的时候，avcodec_decode_audio4 函数运行的都没什么问题；但是它对这样的文件进行 Seek 之后，读取出来的 Packet 就再也没办法在 avcodec_decode_audio4 里解码后，通过 GotFrame 参数返回 1 了。</p>
<p>也就是说，经过这样跟踪下来，可以认为问题出在 FFMPEG 上，或者调用 FFMPEG 的方式有问题。</p>
<p>我是先考虑了 FFMPEG 可能有问题。因为 build-win-deps.sh 脚本是直接拉的 FFMPEG （git://source.ffmpeg.org/ffmpeg.git） 的 master 分支的代码。我尝试把它替换成去链接官网下载的带正式版本号的 FFMPEG （<a title="http://ffmpeg.zeranoe.com/builds/" href="http://ffmpeg.zeranoe.com/builds/">http://ffmpeg.zeranoe.com/builds/</a>） 的 DLL。具体方法是 build-win-deps.sh 脚本执行完成之后会产生一个 deps 文件夹，在里面可以找到一堆 libav*********.a 这样的文件。因为编译器用的是VC，所以这些 .a 文件其实是 .lib 文件。把它换成官网下的 FFMPEG 的 dev 压缩包里解压出来的文件名差不多的 lib 文件，然后再编译FFMS2工程，能得到一个比较小的 FFMS2.DLL （因为是动态链接到 FFMPEG）。配上 FFMPEG 官网下的 shared 那个压缩包里解压出来的 DLL 文件进行测试，会卡死的问题消失了。因此我判断是 FFMS2 拉的 FFMPEG 的 master 分支可能有什么问题，或者静态链接情况下会有什么问题、在动态链接的时候会消失的。</p>
<p>这样编译出来的 FFMS2 还有一个问题，它在 FFMS2_Init 函数里面，会对 FFMPEG 设置几个回调函数去拦截日志输出。如果用动态链接版的 FFMPEG 对 Avisynth 脚本进行转码，此时 FFMS2 和 FFMPEG.EXE 会用的同一套 FFMPEG 的DLL文件（AV****.DLL 那些）。这样在 Avisynth 加载 FFMS2 插件的时候，这个回调函数的设置会洗掉 FFMPEG.EXE 设置的回调，导致你转码过程中看不到任何进度信息。因为大概看了一下，FFMS2 也并没有想把 FFMPEG 的日志拿来干嘛用，所以我就直接把 FFMS2_Init 里几个注册日志回调的代码给注释掉了。再重新构建 FFMS2.DLL，然后拿一个用了 FFMS2 的 Avisynth 脚本去用 FFMPEG.EXE 转码，没有问题了。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.sorayuki.net/?feed=rss2&#038;p=623</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WordPress在后台的“设置——常规”里卡不出来</title>
		<link>http://blog.sorayuki.net/?p=587</link>
		<comments>http://blog.sorayuki.net/?p=587#comments</comments>
		<pubDate>Fri, 20 Jan 2017 16:39:13 +0000</pubDate>
		<dc:creator><![CDATA[空雪梦见]]></dc:creator>
				<category><![CDATA[折腾服务器]]></category>
		<category><![CDATA[问题解决]]></category>

		<guid isPermaLink="false">http://blog.sorayuki.net/?p=587</guid>
		<description><![CDATA[今天买了新域名之后，就打算把博客给移到新域名上。 服务器的虚拟主机配置很容易，只要修改一下 &#60;Virtu &#8230; <a href="http://blog.sorayuki.net/?p=587" class="more-link">继续阅读<span class="screen-reader-text">WordPress在后台的“设置——常规”里卡不出来</span> <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>今天买了新域名之后，就打算把博客给移到新域名上。</p>
<p>服务器的虚拟主机配置很容易，只要修改一下 &lt;VirtualHost&gt; 标签，事情就解决了。但是对于WordPress来说，里面有一些包括页面的链接啊图片等媒体的链接啊，甚至文章里写死的链接，可能还是原来的。我就把整个博客的数据库dump出来，成为包含了大量SQL语句的文本，然后用编辑器的查找替换功能把原来旧域名的字符串替换成新域名的字符串，替换完了再导回去。</p>
<p>为了验证设置，我在博客后台的“设置——常规”里面看了一圈。因为这里包含了WordPress地址和站点地址两个选项。但是我却发现，这个页面加载十分慢，没显示完就卡住不动了。</p>
<p><span id="more-587"></span></p>
<p>我第一反应是网络问题，然而挂了代理服务器以后，加载还是这个样子。我在服务器通过top命令查看，发现httpd进程把CPU都吃完了。这很明显是跑PHP跑的。但是这个PHP程序是在运行WordPress，我对这系统又不熟……还好想到了看日志。日志里面提示程序是运行到compat.php的30行出的问题。</p>
<p>在compat.php文件的30行，我看到了是一个_mb_substr函数，在它的上方，就是一段“检查PHP里有没有mb_substr函数，没有就用_mb_substr代替”这样功能的代码。在文件开头的注释里，写了这个文件用于解决例如低版本PHP有些函数没有这样的问题的。怀疑是它做的这个代替mb_substr函数的东西，性能不太行。</p>
<p>我赶忙到网上搜了一下，发现这个mb_substr属于PHP自带功能，在编译PHP的时候可以通过--enable-mbstring这样的开关来开启，但默认是关闭。解决方法看上去很简单，抓PHP的代码下来，配置的时候打开这个开关然后编译安装……很麻烦。所以我就碰碰运气看看有没有现成的。服务器上的系统是NetBSD，在用 pkgin search mbstring 这样搜索之后，果然发现有现成的。那么就直接装这个现成的。在执行了 pkgin install php56-mbstring 之后，重启apache服务器，再尝试进WordPress后台的设置里的常规页面，没有卡死了。</p>
<p>结论是，WordPress在后台的设置里的常规页面会卡死，就是它这个自制的mb_substr性能不行导致的。用了PHP提供的那一套，就好了。</p>
<p>&nbsp;</p>
<p>另外，在写这篇文章以后，发布出去发现前面参数里 --enable-mbstring 的两个横杠变成了一个破折号。WordPress的这个自动替换也是挺烦人的。网上一搜，有个Quotmarks Replacer插件能禁用这个自动替换，装了就好了。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.sorayuki.net/?feed=rss2&#038;p=587</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>绿色守护治不了腾讯地图但阻止运行能</title>
		<link>http://blog.sorayuki.net/?p=572</link>
		<comments>http://blog.sorayuki.net/?p=572#comments</comments>
		<pubDate>Tue, 16 Feb 2016 14:48:08 +0000</pubDate>
		<dc:creator><![CDATA[空雪梦见]]></dc:creator>
				<category><![CDATA[智能手机使用]]></category>
		<category><![CDATA[问题解决]]></category>

		<guid isPermaLink="false">http://blog.sorayuki.net/?p=572</guid>
		<description><![CDATA[安卓手机上，我之前一直在用绿色守护来对付平时使用中不必要的后台程序。在屏幕关闭后几分钟，在绿色守护列表中的程序 &#8230; <a href="http://blog.sorayuki.net/?p=572" class="more-link">继续阅读<span class="screen-reader-text">绿色守护治不了腾讯地图但阻止运行能</span> <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>安卓手机上，我之前一直在用绿色守护来对付平时使用中不必要的后台程序。在屏幕关闭后几分钟，在绿色守护列表中的程序就会被自动关闭。这样它们就不能一直推送奇奇怪怪的消息给我，以及没有特别深刻体会的据说能够加速手机运行（因为后面跑的服务少了）。</p>
<p>但是在一次批量的程序升级之后，手机出现了奇怪的状况：时不时就振动一下，但是打开发现又没有短信或者通知或者电话。就是振一下、振一下。闹鬼似的。</p>
<p><span id="more-572"></span></p>
<p>想起了去AppOps里面查一下到底是哪个程序用了振动功能。于是等到手机再次莫名其妙振动，赶紧进去查，“CrashMonitor（1分钟前）”。敢情是有程序崩了，而且还是在后台跑着一段时间来崩一次。真尼玛……</p>
<p>这下改为借用电脑守株待兔了。开了logcat，手机放在那边等它崩。一振动赶紧看输出，确实是程序崩了，但是程序是app_process，根本不知道是怎么回事。有父进程ID，但是却看不出父进程是什么，看进程列表又看不到这个ID的，估计是崩完就退掉了。看来要想办法在它崩的那个时候抓到进程列表才行。</p>
<p>于是又开始一边不断循环获取进程列表，一边logcat等它崩，抓到一查，尼玛的父进程是腾讯地图。然而腾讯地图确实是在绿色守护列表里的……只能说这东西可能不太彻底吧。</p>
<p>得，为了验证是不是这个问题，我把腾讯地图卸掉了，放那边等，等来的是它继续莫名其妙振动，捕捉到的信息和之前一样。这地图怎么阴魂不散？尝试重启手机，重启之后，不振了。估计确实是腾讯地图问题。又试了装腾讯地图但是不加入绿色守护的列表，也不振了。十分怀疑是后台给搞了个服务上去而且是卸载程序也不会停掉那种，想要调用app的什么功能，然后这个时候app又被绿色守护限制了，然后就死了。</p>
<p>好吧那我就换个其他地图用还不行吗。……嗯，本以为问题解决了。</p>
<p>我说个笑话，前几天手机又开始莫名其妙振动了。对的除了腾讯地图，一定是中出了其他叛徒。</p>
<p>有了经验以后，马上直接logcat和循环ps看进程列表走起，这次是美团。</p>
<p>不好的预感，可能慢慢会所有app都开始中出了。应该想点其他办法。正好有个群里面有人推荐阻止运行（me.piebridge,forcestopgb），说阻止运行比绿色守护要来得厉害。于是我就试试去了。</p>
<p>试用的结果，问题解决了……好吧。</p>
<p>阻止运行有些地方和绿色守护不一样。用了几天的感受是，如果不清楚什么home键返回键什么什么的不同行为，那么按home键之后到任务列表里把一个app从列表里去除，那么这个app就被阻止运行弄掉了。</p>
<p>总之……能用这个就先用着。有拦不住了的再说。某国著名的app们都喜欢干这种事。然后想各种办法不让它干这种事，就怕是道高一尺魔高一丈，简直（ry）非得人家手机上开发东西的限制都做得像苹果那样啥也不给你搞才肯好好做东西么</p>
<p>不过想想现在windows上的这些全家桶，搞不好就是这么无力</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.sorayuki.net/?feed=rss2&#038;p=572</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>在*nix挂载Windows下的文件夹</title>
		<link>http://blog.sorayuki.net/?p=519</link>
		<comments>http://blog.sorayuki.net/?p=519#comments</comments>
		<pubDate>Sat, 06 Sep 2014 16:33:52 +0000</pubDate>
		<dc:creator><![CDATA[空雪梦见]]></dc:creator>
				<category><![CDATA[问题解决]]></category>

		<guid isPermaLink="false">http://blog.sorayuki.net/?p=519</guid>
		<description><![CDATA[最初是为了学习Unix程序设计的时候，能够更加方便地使用虚拟机：因为我将NetBSD系统安装在虚拟机中。这样的 &#8230; <a href="http://blog.sorayuki.net/?p=519" class="more-link">继续阅读<span class="screen-reader-text">在*nix挂载Windows下的文件夹</span> <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>最初是为了学习Unix程序设计的时候，能够更加方便地使用虚拟机：因为我将NetBSD系统安装在虚拟机中。这样的话虽然能够通过FTP等方式传文件，但总之不是那么方便。如果能直接在Windows下共享这个文件夹，然后虚拟机里面用mount挂载的话，就方便很多，文件啥的全就都在Windows下了，平时日常用的是Windows，所以对我来说是方便。</p>
<p><span id="more-519"></span></p>
<p>1、NFS</p>
<p>最初最初我考虑的是NFS。因为在类Unix系统下，比起Samba来说NFS才是正统一点的办法吧。到网上搜NFS服务器，能搜出一些，试过的有FreeNFSd和WinNFSd。这两个无一例外都正常安装正常启动，还有一个相同点就是都在虚拟机里的NetBSD上挂载不起来。</p>
<p>我：<span style="font-family: Courier New;">mount_nfs 192.168.61.1:/ /root/host<br />
</span>它：<span style="font-family: Courier New;">Authentication error.</span></p>
<p>但是事实上不管是FreeNFSd还是WinNFSd，都没有任何给你设置身份认证的地方……就因为这个，昨天晚上trial and error持续到凌晨三点，最终支持不住放弃了。总之简单说就是，没搞成功。</p>
<hr />
<p>2、Samba</p>
<p>搞不起NFS那就用Windows自带的共享吧。Windows自带共享其实也挺够呛的，因为这东西能设置的地方又很多，我又不熟。</p>
<p>除了对着文件夹右键选属性以外，在 开始——控制面板——系统和安全——管理工具——计算机管理 打开的对话框里面，找到 系统工具——共享文件夹——共享，在里面可以空白处点右键选添加共享文件夹，这里看起来好像会专业一点，也能列出你共享的所有文件夹的列表。然后就是<strong><span style="color: #ff0000;">默认设置下，如果用来访问共享文件夹的账户没有密码，那么是不让访问的</span></strong>，所以如果不想给自己平时用的账户设置密码，那么还要重新创建一个用户。也是在这个对话框，系统工具——本地用户和组——用户 里面，可以空白处点右键选添加用户。用户添加之后，要确保这个用户可以通过网络访问共享文件夹，再回到刚才共享文件夹的地方，右键点击某个共享选属性，可以<strong><span style="color: #ff0000;">在“共享权限”页面里面的“组和用户名”里添加可以通过网络访问这个共享文件夹的用户</span></strong>，然后<span style="color: #ff0000;"><strong>在“安全”那边允许这个用户访问此文件夹</strong></span>。</p>
<p>这样搞过以后还不够，还要确认这样的共享可以远程访问。在 开始——控制面板——网络和Internet——网络和共享中心，左边选“更改高级共享设置”，<strong><span style="color: #ff0000;">检查一下对公用网络和家庭网络，“网络发现”和“文件和打印机共享”是不是允许</span></strong>，不允许的话也是没办法被虚拟机里挂载的。至于如果虚拟机所使用的网卡是公用网络但是不想在公用网络上开启共享（安全问题啊……），那么就把虚拟机的网卡改为私有网络即可。</p>
<p>更麻烦的事情是，虚拟机几张网卡在“未识别的网络”下，此时那个“公用网络”或者“家庭网络”是不能点的，所以改不了。网上找了一通，搜英文关键词的时候才搜出来。一个是这里（ <a title="http://social.technet.microsoft.com/Forums/windows/en-US/7b0d5729-af12-4009-bec6-de877cd3fb2e/change-adapters-location-windows-7?forum=w7itpronetworking" href="http://social.technet.microsoft.com/Forums/windows/en-US/7b0d5729-af12-4009-bec6-de877cd3fb2e/change-adapters-location-windows-7?forum=w7itpronetworking">http://social.technet.microsoft.com/Forums/windows/en-US/7b0d5729-af12-4009-bec6-de877cd3fb2e/change-adapters-location-windows-7?forum=w7itpronetworking</a> ），它说<strong><span style="color: #ff0000;">只有设置了默认网站的网卡才可以设置网络位置</span></strong>；一个是这里（ <a title="http://www.sevenforums.com/tutorials/71408-unidentified-networks-set-private-public.html" href="http://www.sevenforums.com/tutorials/71408-unidentified-networks-set-private-public.html">http://www.sevenforums.com/tutorials/71408-unidentified-networks-set-private-public.html</a> ），<strong><span style="color: #ff0000;">在控制面板——系统和安全——管理工具——本地安全策略 里面，找到“网络列表管理器策略”，可以直接把无法识别的网络的所属是公用还是私有给改了</span></strong>。不过这样就是一次性把所有“未识别网络”下面的网卡的位置改了。单个改的方法暂时还不知道……</p>
<p>这样搞完以后，Windows下访问自己的共享是没问题了，在虚拟机里的NetBSD里mount挂载的时候又开始trial and error。几经尝试找到了要怎么样才能挂载成功：<strong><span style="color: #ff0000;">mount参数里面那个server参数要用主机的NetBIOS名称，用IP地址行不通的</span></strong>。简单说就是，比如我电脑IP是192.168.61.1，主机名叫SoraYuki-PC，我在Windows用 \192.168.61.1\nfsshare 可以访问我的共享文件夹，用 \SoraYuki-PC\nfsshare 也可以访问。但是在NetBSD下挂载的时候，用 //sora@192.168.61.1/nfsshare 就挂不上，用 //sora@SoraYuki-PC/nfsshare 就能挂上。如果不放心那个SoraYuki-PC它能不能解析出来，直接用-I参数强制指定IP即可。比如这样：</p>
<p><span style="font-family: Courier New;">mount_smbfs -I 192.168.61.1 //sora@SoraYuki-PC/nfsshare /root/host</span></p>
<p>关于NetBIOS计算机名，在开始——计算机点右键，选属性，然后左边的“高级系统设置”，在计算机名标签页可以设置和查看计算机名。</p>
<p>这条mount命令的-o里面不能像Linux下那样直接添加用户名密码的样子。不过可以在/etc/nsmb.conf 或者 ~/.nsmbrc 里面填入密码的样子，具体没试过，详细在 man mount_smbfs 里面可以看到。</p>
<p>在Debian下，要安装第一片DVD里的cifs.utils才能挂载，用的是mount.cifs，不知道为啥不是smb或者smbfs，也许在其他光盘里，或者联网在线安装smbfs的吧。我全程离线DVD安装，并且只下了DVD 1，最后装的是cifs.utils。具体挂载的时候因为不知道NetBSD下那个mount_smbfs的-I参数对应的是Linux下这个mount.cifs的什么参数，所以主机名直接往 /etc/hosts里面写了。</p>
<p><span style="font-family: Courier New;">mount.cifs -o user=sora,password=aaabbb //SoraYuki-PC/nfsshare /root/host</span></p>
<p>user不能写在主机名前面，用 用户@主机名 的方式，会被当作主机名的一部分去解析。</p>
<hr />
<p>3、SSHFS</p>
<p>虽然Samba搞成功了，但是折腾了这么久，还好麻烦。在饭否上被人一提醒，去搜了一下，才发现原来可以通过SSH挂载的。SSH有个SFTP协议，以前一直以为是FTP上加个安全的壳就像是HTTP和HTTPS的关系，再仔细分析不是这么回事。这货可以像NFS那样使用，于是就赶忙试了一下，下了一个FreeSSHd，添加用户、设置SFTP的home目录，在NetBSD下一挂就成功。命令行大概是这样</p>
<p><span style="font-family: Courier New;">mount_psshfs sora@192.168.61.1:/ /root/host</span></p>
<p>一次就成功，感觉很省力。但是Debian的第一片DVDISO里面没有能挂载sftp的东西，要么在线安装要么去下其他ISO。而且这东西和samba不同，貌似不让你存一个密码在配置文件中的（Debian下不知道，NetBSD下是不行）。所以如果想要自动挂载，要通过public key / private key这种方式来。这种方式目前还没研究过，不太清楚整个过程。等之后有时间看看。</p>
<p>（FreeSSHd安装全程没看到有许可协议相关的东西出现，后来搜了一下发现确实是开源软件，不过和其他一些常见开源软件不同，它代码是要花钱买的）</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.sorayuki.net/?feed=rss2&#038;p=519</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WindowsDDK里用std::wstring的问题</title>
		<link>http://blog.sorayuki.net/?p=515</link>
		<comments>http://blog.sorayuki.net/?p=515#comments</comments>
		<pubDate>Sat, 30 Aug 2014 15:30:37 +0000</pubDate>
		<dc:creator><![CDATA[空雪梦见]]></dc:creator>
				<category><![CDATA[VC]]></category>
		<category><![CDATA[Windows编程]]></category>
		<category><![CDATA[问题解决]]></category>

		<guid isPermaLink="false">http://blog.sorayuki.net/?p=515</guid>
		<description><![CDATA[今天晚上尝试帮某网友制作一个伪春菜的插件，能够检查两次调用过程中剪贴板里面的东西有没有变化（用GetClipb &#8230; <a href="http://blog.sorayuki.net/?p=515" class="more-link">继续阅读<span class="screen-reader-text">WindowsDDK里用std::wstring的问题</span> <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>今天晚上尝试帮某网友制作一个伪春菜的插件，能够检查两次调用过程中剪贴板里面的东西有没有变化（用GetClipboardSequenceNumber函数）和获取剪贴板里的内容（EnumClipboardFormats和GetClipboardData）。这里都不是重点，重点是我用了 <a href="./?p=9">这一篇博客</a> 里面提到的CSaori库来编写。这个库里面的字符是wchar_t类型，这很好，也用了std::basic_string&lt;wchar_t&gt;（其实就是std::wstring），这也很好。不好的地方在于，我为了减小最终DLL的体积、用Windows Driver Kit里面的编译器来编译程序使得动态链接到运行库的时候，报错了。</p>
<p><span id="more-515"></span>
<p>程序本身是没有问题，因为我用VS2010编译器编译它就正常，而且还能运行，运行起来也没问题。仔细查看DDK编译器的报错信息，大概是</p>
<pre style="height: 221px; width: 696px">error LNK2019: unresolved external symbol "__declspec(dllimport) p
ublic: wchar_t&amp; __thiscall std::basic_string&lt;wchar_t,struct std::char_traits&lt;wch
ar_t&gt;,class std::allocator&lt;wchar_t&gt; &gt;::operator[](unsigned int)" (__imp_??A?$bas
ic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAA_WI@Z) reference
d in function "public: bool __thiscall CSAORIInput::parseString(class std::basic
_string&lt;wchar_t,struct std::char_traits&lt;wchar_t&gt;,class std::allocator&lt;wchar_t&gt; &gt;
 const &amp;)" (?parseString@CSAORIInput@@QAE_NABV?$basic_string@_WU?$char_traits@_W
@std@@V?$allocator@_W@2@@std@@@Z)</pre>
<p>这个样子的，目测意思是链接不上std::wstring。</p>
<p>感觉不应该啊，它不是支持宽字符字符串对象的吗。然后上网搜搜出了这么一个东西：</p>
<p><a title="http://stackoverflow.com/questions/5988457/is-wchar-t-supported-in-c-wdk-stl-i-get-unresolved-external-symbols" href="http://stackoverflow.com/questions/5988457/is-wchar-t-supported-in-c-wdk-stl-i-get-unresolved-external-symbols">http://stackoverflow.com/questions/5988457/is-wchar-t-supported-in-c-wdk-stl-i-get-unresolved-external-symbols</a></p>
<p>感觉好坑……编译器和库不够匹配的结果吗。库用的是VC6.0里面的吧，但是因为编译器是新的，默认wchar_t是内置类型，而库并不是这样的，最终链不上。</p>
<p>最终加上了 /Zc:wchar_t- 参数，它就好了。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.sorayuki.net/?feed=rss2&#038;p=515</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>MinGW-GCC不支持通配符，make大法好</title>
		<link>http://blog.sorayuki.net/?p=514</link>
		<comments>http://blog.sorayuki.net/?p=514#comments</comments>
		<pubDate>Sun, 17 Aug 2014 12:39:53 +0000</pubDate>
		<dc:creator><![CDATA[空雪梦见]]></dc:creator>
				<category><![CDATA[程序设计]]></category>
		<category><![CDATA[问题解决]]></category>

		<guid isPermaLink="false">http://blog.sorayuki.net/?p=514</guid>
		<description><![CDATA[之前在公司做某个自动测试工具的时候，考虑到程序的灵活性，用了LUA作流程控制（嗯……结果到最后还被技术总监批评 &#8230; <a href="http://blog.sorayuki.net/?p=514" class="more-link">继续阅读<span class="screen-reader-text">MinGW-GCC不支持通配符，make大法好</span> <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>之前在公司做某个自动测试工具的时候，考虑到程序的灵活性，用了LUA作流程控制（嗯……结果到最后还被技术总监批评了，说工具本来很简单的被搞得复杂了，开始有各种奇怪的依赖了，有欠考虑）。这就需要编译LUA，但是当时公司的VisualStudio可能是配置不正确或者其他什么原因，VS的命令提示符打不开，我也懒得去修，最后用了GCC。装的是TDM-GCC 64位版。</p>
<p>然后呢就遇上了一个比较麻烦的问题：这个版本的GCC不支持通配符。平时我自己用的都是32位版本，新买的电脑虽然装的是64位系统但是一个是没买多久、一个是还没开发过64位程序，所以没搞过64位编译器。现在要编译出来DLL可能要给64位的C#程序调用，所以需要64位的编译器。然后它不能 gcc -shared -olua.dll *.c：出错信息说找不到叫做*.c的文件。以前一直用的32位编译器，对于这样的命令行都能正常运行的……</p>
<p><span id="more-514"></span>
<p>虽然当场用了比较土的方法解决，就是先dir *.c /b &gt; xxx.txt 然后用notepad++打开这个txt把所有换行替换为回车然后复制出来粘贴到命令行上，但是考虑到以后可能还有类似的情况，每次都用这样的办法实在有些麻烦，所以还是要想想应该怎么解决的。</p>
<p>最初我想到的办法是装一个Windows下的Unix-like shell，比如MSYS或者CygWin都能在*.c这样的东西被送入程序命令行之前给你展开。首先考虑是MSYS，去下载的时候发现只找到了在线安装包，或者很老版本的离线安装包。新版本都没有离线安装包了。想到要在线安装，并且安装的时候都不知道网络会是什么样子的速度或者甚至可能没有网络连接，就一下子热情大减，很是烦躁。</p>
<p>在某个程序员交流群里提出了这样的问题，没想到很快一个叫做MiliMeow的群友就给出了解决方法：让make工具去展开。我检查了一下TDM-GCC 64位版的安装目录，在bin下面有个叫做mingw32-make的东西，目测能提供一定的帮助。于是就搞了这样一个make文件</p>
<pre>SRCS = $(wildcard *.c)
all :
	gcc -shared -olua.dll $(SRCS)</pre>
<p><strong>（注意：缩进用的是tab，四个空格看起来是不行的）</strong><br />运行一下mingw32-make，没想到真的就可以了。虽然绕了一步，但是最重要的是，这个mingw32-make是TDM-GCC安装包里面自带的工具，不用临时手忙脚乱再去找其他什么东西了。我自己虽然是写过make文件，但是这种通配符啥的还是没用过，所以……</p>
<p>利用make工具来展开通配符这一点实在是很聪明。这能力的差距果然非常明显呢……不好好提高一下不行了orz</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.sorayuki.net/?feed=rss2&#038;p=514</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>.net 2.0下往流输出文本多了抛异常</title>
		<link>http://blog.sorayuki.net/?p=331</link>
		<comments>http://blog.sorayuki.net/?p=331#comments</comments>
		<pubDate>Sat, 07 Sep 2013 13:59:35 +0000</pubDate>
		<dc:creator><![CDATA[空雪梦见]]></dc:creator>
				<category><![CDATA[Windows编程]]></category>
		<category><![CDATA[问题解决]]></category>

		<guid isPermaLink="false">http://blog.sorayuki.net/?p=331</guid>
		<description><![CDATA[前天在群里聊天的时候，喵喵提到.net 2.0平台下，有个控制台程序运行时间久了，呃，要说有多久可能一个月那种 &#8230; <a href="http://blog.sorayuki.net/?p=331" class="more-link">继续阅读<span class="screen-reader-text">.net 2.0下往流输出文本多了抛异常</span> <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>前天在群里聊天的时候，<a href="http://www.aoisnow.net/blog/" target="_blank">喵喵</a>提到.net 2.0平台下，有个控制台程序运行时间久了，呃，要说有多久可能一个月那种程度吧，崩了。而且是崩在Console.Write里面。说上网找了以后说是.net平台自己有问题。</p>
<p>第二天有空的时候，我自己试验了一下，确实很坑，我开了个文本文件（FileStream），然后以它创建一个StreamWriter，之后往里面写了三四个G的数据，写一半的时候就直接抛出了异常，异常信息和喵喵描述的一致。</p>
<p><span id="more-331"></span>
<p>这样说的话问题大概出在StreamWriter会用到的某些代码的实现里面？因为Console.Write的行为要说起来，也确实很像StreamWriter，下面的Stream是Standard output（标准输出，C语言里面写stdout）。这种坑感觉就像是编译器的bug一样，比如VC 6.0自带的标准库里给std::string用的std::getline一样，一不小心掉进去的话连错哪里都不知道，因为程序员面对这一类的库，一般第一个只会想到是自己代码哪里不对了吧？</p>
<p>不过后来我又测试了.net 3.0 3.5 4.0 4.5，结论是2.0 3.0 3.5会出现这样的问题，而4.0 4.5不会。和是不是Client Profile没有关系。升级4.0是最直接的办法了。</p>
<p>这些当作标准库用的东西的Bug，因为不知道什么时候会碰到，也不知道到底有多少，总觉得……挺那啥的。</p>
<p>哦对了之前看Boost.Asio库的时候，也遇到有这样的：</p>
<blockquote><h6><a name="boost_asio.reference.basic_socket.cancel.overload2.remarks"></a>Remarks</h6>
<p>Calls to <code>cancel()</code> will always fail with <code>boost::asio::error::operation_not_supported</code> when run on Windows XP, Windows Server 2003, and earlier versions of Windows, unless BOOST_ASIO_ENABLE_CANCELIO is defined. However, the CancelIo function has two issues that should be considered before enabling its use:
<ul>
<li>It will only cancel asynchronous operations that were initiated in the current thread.
<li>It can appear to complete without error, but the request to cancel the unfinished operations may be silently ignored by the operating system. Whether it works or not seems to depend on the drivers that are installed. </li>
</ul>
<p>For portable cancellation, consider using one of the following alternatives:
<ul>
<li>Disable asio's I/O completion port backend by defining BOOST_ASIO_DISABLE_IOCP.
<li>Use the <code>close()</code> function to simultaneously cancel the outstanding operations and close the socket. </li>
</ul>
<p>When running on Windows Vista, Windows Server 2008, and later, the CancelIoEx function is always used. This function does not have the problems described above.
<p><a href="http://www.boost.org/doc/libs/1_54_0/doc/html/boost_asio/reference/basic_socket/cancel/overload2.html#boost_asio.reference.basic_socket.cancel.overload2.remarks" target="_blank">来源</a></p>
</blockquote>
<p>这种东西到底怎么躲得掉了啦……写代码的工作好可怕＞＜</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.sorayuki.net/?feed=rss2&#038;p=331</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>curl_easy_perform卡着了</title>
		<link>http://blog.sorayuki.net/?p=330</link>
		<comments>http://blog.sorayuki.net/?p=330#comments</comments>
		<pubDate>Sat, 07 Sep 2013 13:40:48 +0000</pubDate>
		<dc:creator><![CDATA[空雪梦见]]></dc:creator>
				<category><![CDATA[程序设计]]></category>
		<category><![CDATA[问题解决]]></category>

		<guid isPermaLink="false">http://blog.sorayuki.net/?p=330</guid>
		<description><![CDATA[之前想做个挂stage1st论坛在线时间的工具，用C#写出来以后虽然用着也确实可以登录和浏览，但是用mono在 &#8230; <a href="http://blog.sorayuki.net/?p=330" class="more-link">继续阅读<span class="screen-reader-text">curl_easy_perform卡着了</span> <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>之前想做个挂stage1st论坛在线时间的工具，用C#写出来以后虽然用着也确实可以登录和浏览，但是用mono在vps的linux系统上跑，内存占了实在是有点多，想到vps本来内存就这么小，还跑了一大堆奇怪的服务，最后作罢。</p>
<p>但是果然想想还是不甘心，于是就又操起C++来弄，调用了CURL函数库来搞，这样windows和Linux下就都可以使用了。弄好以后也确实可以运行，于是就这么挂着。</p>
<p>为了详细知道这工具现在在干什么，所以我让它输出当前动作的信息。挂了几天之后，发现好像没有新的信息输出了。用gdb附加上去看调用栈，卡在curl_select里面了（和自己的代码的接口是curl_easy_perform）。这个时候的工具在输出信息的时候还不会附上当前的时间，所以也不太确定到底什么时候出的问题。于是我就改了一下代码，在输出的地方加上了时间，然后挂着。今天下午又发现它卡着了，看了时间，卡了2个多小时了。用gdb再附加上去，还是那个地方卡着。</p>
<p><span id="more-330"></span>
<p>我觉得这不像是自己的问题啊，卡在那里面了我也没办法来着。于是搜“curl_select hang”，确实也有人反映有一样的问题。但是没找到解决方法。然后就又搜索“curl_easy_perform 卡住了”，这下找到有人说关于这个的问题了。</p>
<blockquote><p>在使用libcurl时, jwisp发现, curl_easy_perform是阻塞的方式进行下载的, curl_easy_perform执行后,程序会在这里阻塞等待下载结束(成功结束或者失败结束).此时若正常下载一段时间后,进行网络中断, curl_easy_perform并不会返回失败,而是阻塞整个程序卡在这里,此时即使网络连接重新恢复, curl_easy_perform也无法恢复继续下载,导致整个程序出现”死机”状态.</p>
<p>来源 <a title="http://blog.csdn.net/javarat/article/details/8002204" href="http://blog.csdn.net/javarat/article/details/8002204">http://blog.csdn.net/javarat/article/details/8002204</a></p>
</blockquote>
<p>而下面的解决方法提到使用multi接口可以自己控制超时等的问题，然后我也就没继续看下去而直接使用multi接口来搞了。</p>
<p>它那个multi的接口大概意思是，首先弄个multi的handle，然后把easy的handle绑上去，之后perform是非阻塞的。我自己也没多试验，比如是不是一定要先perform，能不能先select之类。于是就按照curl自己给出的例子，perform一次以后，拿fd_set，然后在fd_set上调用select，然后再perform，重复到结束为止。因为select是自己调用的，所以可以比较方便设置超时时间。</p>
<p>虽然我在看文档的时候发现curl其实有一个opt给出设置超时时间的，但是这个设置好像只有某个特定版本之后才添加的，服务器用yum安装的curl版本实在是比较低，看着不像是有这个设置的样子，……于是没有试验。</p>
<p>现在代码放服务器上跑着，跑个几天看看还有没有出现卡着的问题。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.sorayuki.net/?feed=rss2&#038;p=330</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>使WebBrowser控件使用IE10核心</title>
		<link>http://blog.sorayuki.net/?p=324</link>
		<comments>http://blog.sorayuki.net/?p=324#comments</comments>
		<pubDate>Sun, 25 Aug 2013 14:18:44 +0000</pubDate>
		<dc:creator><![CDATA[空雪梦见]]></dc:creator>
				<category><![CDATA[Windows编程]]></category>
		<category><![CDATA[问题解决]]></category>

		<guid isPermaLink="false">http://blog.sorayuki.net/?p=324</guid>
		<description><![CDATA[在程序中要显示一个网页或者啥的的时候，WebBrowser控件很好用。但是这东西似乎不会随着你IE的升级而升级 &#8230; <a href="http://blog.sorayuki.net/?p=324" class="more-link">继续阅读<span class="screen-reader-text">使WebBrowser控件使用IE10核心</span> <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>在程序中要显示一个网页或者啥的的时候，WebBrowser控件很好用。但是这东西似乎不会随着你IE的升级而升级，而是一直使用IE6核心。</p>
<p><span id="more-324"></span>
<p>比如今天群里在传一个无聊的网站 <a title="http://orteil.dashnet.org/experiments/cookie/" href="http://orteil.dashnet.org/experiments/cookie/">http://orteil.dashnet.org/experiments/cookie/</a> 简单说就是不停点鼠标。然后我就要搞个作弊器，运行脚本直接变更那个Cookie数。简单的办法就是拖一个WebBrowser控件，然后使用这样的代码修改数目：</p>
<div id="scid:887EC618-8FBE-49a5-A908-2339AF2EC720:d7427de1-fc23-4120-b2a3-9d43ecd55e40" class="wlWriterEditableSmartContent" style="float: none; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px">         <code>
<pre>webBrowser1.Navigate("javascript:function Hack(a) {Cookies+=a;}Hack(10000);");
 </pre>
<p></code>
      </div>
<p>但是发现一个问题，就是WebBrowser控件打开网页的时候老是报错，但是用IE开却不会。我系统里装的是IE10，我觉得WebBrowser在使用IE6内核。</p>
<p>上网搜索关键字“WebBrowser C# IE10”以后出来了<a href="http://stackoverflow.com/questions/15829397/webbrowser-using-ie10-c-sharp-winform" target="_blank">一个StackOverflow的网页</a>，原来是在注册表里面添加一个键值就好了。</p>
<p><div id="scid:887EC618-8FBE-49a5-A908-2339AF2EC720:d4da8851-b3a4-4062-9811-942e8253edb6" class="wlWriterEditableSmartContent" style="float: none; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px">
        <code>
<pre>FEATURE_BROWSER_EMULATION "myAppName.exe"=10000 (or 0x02710) and not 1000.
In HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULATION
and HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULATION

It works for me
 </pre>
<p></code>
      </div>
</p>
<p>然后我顺便把如何删除这样字符串值的注册表文件内容贴出来。用</p>
<div id="scid:887EC618-8FBE-49a5-A908-2339AF2EC720:4e5eefc8-5f07-4a2f-9f39-11e6bd62531c" class="wlWriterEditableSmartContent" style="float: none; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px">
        <code>
<pre>Windows Registry Editor Version 5.00

[-HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULATION\HackCookies.exe]
 </pre>
<p></code>
      </div>
<p>是不行的。要这样：</p>
<div id="scid:887EC618-8FBE-49a5-A908-2339AF2EC720:4fa9d8d7-85cd-4930-983b-52c656c74d98" class="wlWriterEditableSmartContent" style="float: none; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px">
        <code>
<pre>Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULATION]
"HackCookies.exe"=-

 </pre>
<p></code>
      </div>
</p>
<p>注意：VS里面调试的话，EXE文件名是HackCookies.vshost.exe。</p>
<p>&nbsp;</p>
<p>然后注入脚本方面，<a href="http://stackoverflow.com/questions/153748/how-to-inject-javascript-in-webbrowser-control" target="_blank">网上</a>找到这样的方法</p>
<p><div id="scid:887EC618-8FBE-49a5-A908-2339AF2EC720:7e26627d-a299-469b-9375-c487b3ee4352" class="wlWriterEditableSmartContent" style="float: none; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px">
        <code>
<pre>HtmlDocument doc = browser.Document;
HtmlElement head = doc.GetElementsByTagName("head")[0];
HtmlElement s = doc.CreateElement("script");
s.SetAttribute("text","alert('hello');");
head.AppendChild(s);

(tested in .NET 4 / Windows Forms App)
 </pre>
<p></code>
      </div>
</p>
<p>或者还有这样的</p>
<div id="scid:887EC618-8FBE-49a5-A908-2339AF2EC720:02b20d72-a50a-4069-8ee9-2cdfba272bff" class="wlWriterEditableSmartContent" style="float: none; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px">
        <code>
<pre>Here is the easiest way that I found after working on this:
string jCode = "alert("Hello");"
// or any combination of your JavaScript commands
// (including function calls, variables... etc)

// WebBrowser webBrowser1 is what you are using for your web browser
webBrowser1.Document.InvokeScript("eval", new object[] { jCode });

What global JavaScript function eval(str) does is parses and executes whatever is written in str. Check w3schools ref here.
 </pre>
<p></code>
      </div></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.sorayuki.net/?feed=rss2&#038;p=324</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
