Home mail me! Syndicate this site using RSS

Archive for C/C++


解决IE中IFRAME无法保留SESSION的问题

最近用C++开发一个基于WebBrowser的Application,界面都是在一个IFRAME里展示,由于需要会员登录模块,结果却出现在IFRAME里无法保留SESSION的问题,上MICROSOFT官方找到了答案:

@header(’P3P: CP=”CAO PSA OUR”‘);

一句代码搞定!

P3P是微软的隐私策略,通常情况下跨域IFRAME或者FRAMESET默认采用的隐私策略为“中”,该级别的策略拒绝保留SESSION。CAO PSA OUR则意味着你同意跨域保留SESSION。

详细资料可以查看官方文档:http://support.microsoft.com/kb/323752

Sofee Domain Typo Generator released

Sofee Domain Typo Generator will take a domain name you specify and generator a list of suggestions of likely human mis-spellings and mis-typings for that domain.

The typo methods we do are:

  • Wrong key (QWERTY keyboard) typos (e.g. google.com -> goofle.com)
  • Missed character typos (e.g. google.com -> goole.com)
  • Transposed character typos (e.g. google.com -> goolge.com)
  • Double character typos (e.g. google.com -> googgle.com)
  • Look alikes typos (e.g. google.com -> g00gle.com)

Sofee Domain Typo Generator Screenshot

Click here for detail.

去掉CWebBorwser2控件的滚动条

重载XDocHostUIHandler::GetHostInfo方法即可

相关代码如下:

HRESULT FAR EXPORT CMyControlSite::XDocHostUIHandler::GetHostInfo(DOCHOSTUIINFO* pInfo)
{
    METHOD_PROLOGUE(CMyControlSite, DocHostUIHandler)
    //pInfo->dwFlags = DOCHOSTUIFLAG_NO3DBORDER;
    pInfo->dwFlags = DOCHOSTUIFLAG_DIALOG;		// 禁止选择
    pInfo->dwFlags |= DOCHOSTUIFLAG_SCROLL_NO;	// 去掉滚动条
    pInfo->dwDoubleClick = DOCHOSTUIDBLCLK_DEFAULT;
    return S_OK;
}

该方法中,可延伸的内容也非常,比如设置默认的CSS,设置浏览器默认的属性等。
DOCHOSTUIFLAG_DIALOG = 0×00000001,
DOCHOSTUIFLAG_DISABLE_HELP_MENU = 0×00000002,
DOCHOSTUIFLAG_NO3DBORDER = 0×00000004,
DOCHOSTUIFLAG_SCROLL_NO = 0×00000008,
DOCHOSTUIFLAG_DISABLE_SCRIPT_INACTIVE = 0×00000010,
DOCHOSTUIFLAG_OPENNEWWIN = 0×00000020,
DOCHOSTUIFLAG_DISABLE_OFFSCREEN = 0×00000040,
DOCHOSTUIFLAG_FLAT_SCROLLBAR = 0×00000080,
DOCHOSTUIFLAG_DIV_BLOCKDEFAULT = 0×00000100,
DOCHOSTUIFLAG_ACTIVATE_CLIENTHIT_ONLY = 0×00000200,
DOCHOSTUIFLAG_OVERRIDEBEHAVIORFACTORY = 0×00000400,
DOCHOSTUIFLAG_CODEPAGELINKEDFONTS = 0×00000800,
DOCHOSTUIFLAG_URL_ENCODING_DISABLE_UTF8 = 0×00001000,
DOCHOSTUIFLAG_URL_ENCODING_ENABLE_UTF8 = 0×00002000,
DOCHOSTUIFLAG_ENABLE_FORMS_AUTOCOMPLETE = 0×00004000,
DOCHOSTUIFLAG_ENABLE_INPLACE_NAVIGATION = 0×00010000,
DOCHOSTUIFLAG_IME_ENABLE_RECONVERSION = 0×00020000,
DOCHOSTUIFLAG_THEME = 0×00040000,
DOCHOSTUIFLAG_NOTHEME = 0×00080000,
DOCHOSTUIFLAG_NOPICS = 0×00100000,
DOCHOSTUIFLAG_NO3DOUTERBORDER = 0×00200000

Disable URLDownloadToFile cache

VC++提供了URLDownloadToFile和URLDownloadToCacheFile两个方法用来实现文件的下载,省去了自己写SOCKET。

默认情况下,这两个方法都会从缓存里找,若存在缓存,则会直接从缓存取,而不再下载(IE就是这么实现的),这样大大增加了下载出错的几率。

下面提供两种方法来禁止缓存,而每次都从服务器端下载
方法一:
该方法最简单,在调用URLDownloadToFile之间调用DeleteUrlCacheEntry即可。
DeleteUrlCacheEntry()方法在Wininet.h头文件里定义。

DeleteUrlCacheEntry(remote_file);
HRESULT hr = URLDownloadToFile(NULL, local_file, remote_file, 0, 0);

方法二:
这种方法适合需实现自定义下载进度的,原理就是实现一个IBindStatusCallback接口的GetBindInfo方法,加入BINDF_GETNEWESTVERSION | BINDF_NOWRITECACHE属性即可。相关代码如下:

STDMETHODIMP CBindStatusCallback::GetBindInfo(DWORD *pgrfBINDF, BINDINFO *pbindInfo)
{
    if (!pgrfBINDF || !pbindInfo || pgrfBINDF == NULL) {
        return E_POINTER;
    }
 
    // force redownload
    *pgrfBINDF |= BINDF_GETNEWESTVERSION | BINDF_NOWRITECACHE;
 
    if (pbindInfo->cbSize<sizeof(BINDINFO)) {
        return E_INVALIDARG;
    }
 
    if (pbindInfo->dwBindVerb!=BINDVERB_POST && pbindInfo->dwBindVerb!=BINDVERB_GET) {
        return E_UNEXPECTED;
    }
    return E_NOTIMPL;
}

C++遍历中删除std::map元素

最近在写一个CNNIC的玉米抢注工具,碰到一个std::map遍历中不能删除元素的问题,以下是GOOGLE的结果,记录一下:

在std::list中删除一个元素非常简单,直接使用erase方法即可,代码如下:

for(iter = list.begin(); iter != list.end();) {
	if (shouldDelete(*iter))
		iter = list.erase(iter);
	else
		++iter;
}

或者更简单点

list.erase(std::remove_if(list.begin(), list.end(), shouldDelete), list_end());

然而根据STL std::map中的定义void erase(iterator pos),此erase并不返回下一个元素的迭代器,因此不能采用std::list的方法

The truth is that ‘erase’ in associative containers doesn’t invalidate any iterators except those that point to elements being erased (that’s also true for ’sid::list’). For this reason, you don’t really need ‘map::erase’ to return an iterator. Just do this

for(iter = map.begin(); iter != map.end();) {
	if (shouldDelete(*iter))
		map.erase(iter++);
	else
		++iter;
}

当然此方法同样也适合于std::list等。

[老文章 ]使用VC++开发PHP扩展注意事项

一、默认情况下,C++是使用.cpp作为扩展名的,而PHP是用C写的,因此必须使用C++提供的C连接交换指定符号extern “C”来解决这个问题,以下两部分语句必须被包含:

extern "C" {
#include "php.h"
#include "php_ini.h"
#include "ext/standard/info.h"
... // 其他C头文件
}

extern "C" {
#ifdef COMPILE_DL_MYEXT
ZEND_GET_MODULE(myext)
#endif
}

Read more…

[老文章]从PHP源代码修改phpinfo中的LOGO及彩蛋

1. 大家先来看一段PHP代码(gif2h.php):

< ?php
// 将GIF转换为C语言中的H文件
$filename = "mylogo.gif";
$fp = f open($filename, "rb");
$buffer = f read($fp, filesize($filename));
f close($fp);
$len = strlen($buffer);
$fp = f open("mylogo.h", "wb");
f write($fp, "unsigned char php_logo[] = {");
for ($i=0; $i<=$len; $i++) {
	if($i % 10 == 0) {
		f write($fp, "\n\t\t");
	}
	if($i == $len) {
		$str = str_pad(ord(substr($buffer, $i, 1)), 3, " ", STR_PAD_LEFT);
	} else {
		$str = str_pad(ord(substr($buffer, $i, 1)), 3, " ", STR_PAD_LEFT) . ", ";
	}
	f write($fp, $str);
}
f write($fp, " };\n");
f close($fp);
?>

上述代码的作用就是将一张GIF图片文件转换为C语言中的头文件(.h)。
Read more…

Timer on Windows and Linux

1. Timer on Windows

Timer on Windows
Read more…