-
variant 变量表
Posted on 十月 24th, 2009 No comments老是要查头文件,又排得不整齐,排一份如下:
LONGLONG llVal; /* VT_I8 */ LONG lVal; /* VT_I4 */ BYTE bVal; /* VT_UI1 */ SHORT iVal; /* VT_I2 */ FLOAT fltVal; /* VT_R4 */ DOUBLE dblVal; /* VT_R8 */ VARIANT_BOOL boolVal; /* VT_BOOL */ SCODE scode; /* VT_ERROR */ CY cyVal; /* VT_CY */ DATE date; /* VT_DATE */ wireBSTR bstrVal; /* VT_BSTR */ IUnknown * punkVal; /* VT_UNKNOWN */ IDispatch * pdispVal; /* VT_DISPATCH */ wirePSAFEARRAY parray; /* VT_ARRAY */ BYTE * pbVal; /* VT_BYREF|VT_UI1 */ SHORT * piVal; /* VT_BYREF|VT_I2 */ LONG * plVal; /* VT_BYREF|VT_I4 */ LONGLONG * pllVal; /* VT_BYREF|VT_I8 */ FLOAT * pfltVal; /* VT_BYREF|VT_R4 */ DOUBLE * pdblVal; /* VT_BYREF|VT_R8 */ VARIANT_BOOL *pboolVal; /* VT_BYREF|VT_BOOL */ SCODE * pscode; /* VT_BYREF|VT_ERROR */ CY * pcyVal; /* VT_BYREF|VT_CY */ DATE * pdate; /* VT_BYREF|VT_DATE */ wireBSTR * pbstrVal; /* VT_BYREF|VT_BSTR */ IUnknown ** ppunkVal; /* VT_BYREF|VT_UNKNOWN */ IDispatch ** ppdispVal; /* VT_BYREF|VT_DISPATCH */ wirePSAFEARRAY *pparray; /* VT_BYREF|VT_ARRAY */ wireVARIANT * pvarVal; /* VT_BYREF|VT_VARIANT */ CHAR cVal; /* VT_I1 */ USHORT uiVal; /* VT_UI2 */ ULONG ulVal; /* VT_UI4 */ ULONGLONG ullVal; /* VT_UI8 */ INT intVal; /* VT_INT */ UINT uintVal; /* VT_UINT */ DECIMAL decVal; /* VT_DECIMAL */ DECIMAL * pdecVal; /* VT_BYREF|VT_DECIMAL */ CHAR * pcVal; /* VT_BYREF|VT_I1 */ USHORT * puiVal; /* VT_BYREF|VT_UI2 */ ULONG * pulVal; /* VT_BYREF|VT_UI4 */ ULONGLONG * pullVal; /* VT_BYREF|VT_UI8 */ INT * pintVal; /* VT_BYREF|VT_INT */ UINT * puintVal; /* VT_BYREF|VT_UINT */ -
透明窗口,连鼠标键盘事件也不接受,全透明
Posted on 八月 1st, 2009 No commentswindows的透明窗口,如果设置了LWA_ALPHA和WS_EX_TRANSPARENT,就会连鼠标键盘事件也给透明过去,这个功能还不错。可以在屏上显示水印。
关键代码:
SetWindowLong(m_hWnd, GWL_EXSTYLE, WS_EX_LAYERED|WS_EX_TRANSPARENT|WS_EX_TOPMOST);
SetLayeredWindowAttributes(m_hWnd, RGB(0,0,0), 120, LWA_ALPHA);
SetWindowPos(m_hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOMOVE|SWP_SHOWWINDOW);demo代码:
static LRESULT WINAPI UIWndProcBase(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { if (msg == WM_PAINT) { PAINTSTRUCT ps; BeginPaint(hWnd, &ps); //OnPaint(ps.hdc); EndPaint(hWnd, &ps); } else if (msg == WM_DESTROY) { PostQuitMessage(0); } return DefWindowProc(hWnd, msg, wParam, lParam); } void UIRun() { WNDCLASSEX wc = {sizeof(wc)}; wc.hInstance = GetModuleHandle(0); wc.lpszClassName = _T("uiclassname"); wc.lpfnWndProc = &UIWndProcBase; wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); RegisterClassEx(&wc); wstring ws = L"aaabbcd"; HWND hParent = CreateWindowExW(WS_EX_TRANSPARENT, _T("EDIT"), _T(""), WS_POPUP, 0, 0, 100, 100, 0, NULL, wc.hInstance, NULL); HWND m_hWnd = CreateWindowEx(0, wc.lpszClassName, ws.c_str(), WS_POPUP, 0, 0, 100, 100, hParent, NULL, wc.hInstance, NULL); SetWindowLong(m_hWnd, GWL_EXSTYLE, WS_EX_LAYERED|WS_EX_TRANSPARENT|WS_EX_TOPMOST); SetLayeredWindowAttributes(m_hWnd, RGB(0,0,0), 120, LWA_ALPHA); SetWindowPos(m_hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOMOVE|SWP_SHOWWINDOW); MSG msg; while (GetMessage(&msg, 0, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } } int main() { UIRun(); return 0; } -
masm造weak symbol
Posted on 四月 24th, 2009 No commentsmasm或ml.exe可以用alias造weak external symbol,这样可以起到链接时有就选用户提供的,无就选系统默认的这样一个功能。这个语法很简单,但不好找。以前找了又忘了,特记下:
alias <sym2> = <sym1>
这次是在这里搜到的:
-
php和mysql支持utf8
Posted on 四月 15th, 2009 No comments老生常谈了,网上很多文,我再多写一篇!
1. my.cnf里加上:
[client]
default-character-set=utf8[mysqld]
default-character-set=utf8重启mysqld,连上去看看:
mysql> SHOW VARIABLES LIKE '%character%';SHOW VARIABLES LIKE 'collation%'; +--------------------------+----------------------------+ | Variable_name | Value | +--------------------------+----------------------------+ | character_set_client | utf8 | | character_set_connection | utf8 | | character_set_database | utf8 | | character_set_filesystem | binary | | character_set_results | utf8 | | character_set_server | utf8 | | character_set_system | utf8 | | character_sets_dir | /usr/share/mysql/charsets/ | +--------------------------+----------------------------+ 8 rows in set (0.00 sec) +----------------------+-----------------+ | Variable_name | Value | +----------------------+-----------------+ | collation_connection | utf8_general_ci | | collation_database | utf8_general_ci | | collation_server | utf8_general_ci | +----------------------+-----------------+ 3 rows in set (0.00 sec)2. php里也要改,写个函数:
<?php function connect_db($dbname) { global $mysql_addr, $mysql_user, $mysql_pass; $dbcon = mysql_connect($mysql_addr, $mysql_user, $mysql_pass); mysql_query("SET NAMES 'utf8'; SET CHARACTER_SET_CLIENT=utf8; " ."SET CHARACTER_SET_RESULTS=utf8; ", $dbcon); if ($dbname) { mysql_select_db($dbname, $dbcon); } return $dbcon; } ?>3. 数据库可以改一下:
alter database mydb CHARACTER SET ‘utf8′ ;
alter table tablename CHARACTER SET ‘utf8′;
不过这两句不会改内容,如果内容原来不是utf8的字节,就要导出导入了.
-
N72手机开发软件部署过程
Posted on 六月 5th, 2008 1 comment我的手机是N72,唉,不先进。
去年给N72写了个软件,现在发现服务器升级用不了了。于是决定改一下。原来配软件花了好久好久,现在发现不太会配了,又折腾了好久才搞定,赶快把过程记下来:
- 安装j2re-1_4_2_16-windows-i586-p.exe,不能装新版的或旧版的。//shit
- 安装WinPcap_3_1.exe,不能装新版的或旧版的。//shit 2.
- 安装ActivePerl-5.6.1.635-MSWin32-x86,不能装新版的或旧版的。//shit 3.
- 安装carbide.c++_v1.2.exe。(download from nokia)
- 安装s60_2nd_sdk_fp3(其它版本不能用于N72)
都装完了后,模拟器可以运行了。但是还是不能上网。记得去年折腾了好多天才搞定,现在总结只要两步走:
首先,在模拟器选项里设好IP,子网掩网,网关,DNS等信息。
然后,关掉模拟器,运行两条命令:
C:\Symbian\8.1a\S60_2nd_FP3\Epoc32\Data>set EPOCROOT=\Symbian\8.1a\S60_2nd_FP3\
C:\Symbian\8.1a\S60_2nd_FP3\Epoc32\Data>perl ../tools/configchange.pl –config ethernetWithCommDB –kernel EKA1 –target winscw –variant UDEB
就可以了,注意第二条命令运行的目录不能错。这样就可以上网了,用慢得像坨屎的carbide c++开发吧。另外这个s60_2nd_sdk_fp3还有几个大BUG,又是一坨屎啊。
最后,发现carbide用bld.inf文件导入的文件,不会生成.sis文件,又折腾了我好久才搞定!!方法,自己去修改pkg文件,然后手动调用makesis.exe,没啥别的办法。创建的工程carbide是会给生成.sis的,一旦把这个工程移除后再导入,就怎么也不会生成sis了,再一次说:shit!
生成sis文件命令:
C:\Symbian\8.1a\S60_2nd_FP3\Epoc32\tools\makesis.exe myproj__.pkg output.sis -v
其中myproj__.pkg是从myproj.pkg改来,手动把其中的$(EPOCROOT)等宏展开。
最后,我的程序修正了服务器数据识别,又可以使用了。 真是够折腾的。
-
一个有意思的warning.
Posted on 五月 10th, 2008 No comments今天看下属的代码才发现的,之前还真没碰到过。
#include <stdio.h> int main() { for (int i=0; i<10; ++i) { for (int i=0; i<10; ++i) { ; } int x = i; } return 0; }gcc编译:
debian:~$ gcc t.cc t.cc: In function ‘int main()’: t.cc:10: warning: name lookup of ‘i’ changed t.cc:4: warning: matches this ‘i’ under ISO standard rules t.cc:6: warning: matches this ‘i’ under old rulesvc编译:
D:\tmp>cl c.cc Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.762 for 80x86 Copyright (C) Microsoft Corporation. All rights reserved. c.cc c.cc(10) : warning C4258: 'i' : definition from the for loop is ignored; the def inition from the enclosing scope is used c.cc(6) : definition of 'i' ignored c.cc(4) : definition of 'i' used如果去掉int x = i;那一行,就没有这个warning。
这个倒也比较好理解,按照旧规则和新规则,int x=i有两种不同的解释,分别对应两个不同scope里的i。所以就给个warning。
-
做了Perl 5.10.0的chm文档
Posted on 四月 27th, 2008 5 comments在 http://perldoc.perl.org/ 上可以看perl的文档。这自然是一件很好的事。
不过我还是比较习惯看chm的文档,比如我要找函数stat的说明,用网页方式的话我要打开浏览器,上到perldoc网站,定位到perlfunc那一页,再找到stat,这个时候可能是需要ctrl+f一下才找得到的,然后再转过去。有了chm文档,就方便了,打开后在index里输入stat回车即可看了。
5.8.8的就先不做了,一般也用不到这些差别。
-
perl utf8值得注意的一点
Posted on 四月 26th, 2008 No commentsuse utf8; my $var="测试啊"; print "OK1\n" if ($var=~/试/); printf "str: %s length: %d\n", $var, length($var); $var = `echo $var`; chomp($var); print "OK2\n" if ($var=~/试/); printf "str: %s length: %d\n", $var, length($var);结果:
debian:~# ./test.pl OK1 Wide character in print at ./test.pl line 11. str: 测试啊 length: 3 str: 测试啊 length: 9可以看到输出内容虽然没有变,但是第一次$var是内在utf8的,而第二次内在格式则不是了。
求长度的结果是第一个三个字符,正确,第二次九个字符,说明内存格式占了9个字符(或者叫octet?搞不懂perl的名词了),编码为utf-8。
这就会带来问题,导致regexp匹配不了。
事实上,我遇到的问题并不是通过IPC读来的字符串,而是直接opendir后由readdir得到的中文文件名。这样得到的也像第二次的$var一样,输出正确,但内在格式不对,导致脚本异常。
既然内存格式已经是utf-8编码了,那解决方案自然就是把9个字符变回三个,这是一个解码的过程。对perl不是很熟,但找了一下,还是找到了答案。只消加入一句即可:
$var = decode('utf8', $var); -
在activeX对象中判定所在网页
Posted on 四月 22nd, 2008 No comments一个很原始的需求是:做了一个activex对象,只希望它在某些站点中使用。不希望在其它站点中使用。
或者说,不希望被别的人偷用。或者不希望被广泛使用而造成安全问题。
比如:在www.foo.com中可以使用,在www.bar.com中不能使用。
由于只有ie能创建并访问activeX,因此本文只适用于IE。
要解决这个问题,关键是两点:
- 如何在activex对象中判定当前域名或当前所在网页url。
- 如何在判定不能使用后,禁止用户使用。
对于2,应该是简单的,不能使用后,所有的接口都返回E_FAIL即可。当然,这里有更好的策略,还可以通知到用户。
对于1,我以前一直没有找到办法,虽然办法很简单。无非是实现一下IObjectWithSite,这样IE在创建activex的时候会把site传给创建的activex,这样就容易取得当前url了:
HRESULT CMyActiveX::SetSite(IN IUnknown *pUnkSite) { CComQIPtr<IServiceProvider> spsp = pUnkSite; pUnkSite->QueryInterface(&m_WebBrowser2); m_WebBrowser2->get_LocationURL(&m_bsUrl); //more.. }对于2,通知到用户的办法是,实现IObjectSafety,然后,在GetInterfaceSafetyOptions和SetInterfaceSafetyOptions中,根据当前情况返回E_FAIL就行了。
以上内容是是研究微软的某软件的一个activex控件在不同网页里的表现不同而发现的。
-
Javascript 终级“解密”
Posted on 四月 15th, 2008 No comments解密加上引号,因为并不是真正的解密。
现在很多网站不让你看js源码,就想办法变形,最后再document.write出来。
显然不管它怎么变形,最后总要调用document.write,我们直接在document.write的实现处,
用native调试来下个断点,不就可以读出来了?
找到document.write函数:
C:\>syminfo /S E:\symbol C:\WINDOWS\ie7\mshtml.dll | grep ::write 7DDA72FB[+ 0] ?writeln@CDocument@@QAGJPAUtagSAFEARRAY@@@Z public:long __stdcall CDocument::writeln(struct tagSAFEARRAY *) 7DCE0741[+ 0] ?write@CDocument@@QAGJPAUtagSAFEARRAY@@@Z public:long __stdcall CDocument::write(struct tagSAFEARRAY *)显然,直接在这两个函数下断点就可以了。
下完需要读一个VARIANT结构,里面是一个VT_I8的safearray,需要了解safearray的结构,就不赘述了。
因为还有更好的办法!
用firebug直接看就是了。原来也不清楚,原来firebug看时,一个javascript段里调用了document.write之后,就会在dom树里紧跟着看到另一个<script></script>的段。所以,直接用firebug翻看就行了。真是简单啊。翻看后可以找个工具把代码格式化一下。
有个软件叫sourceformatx,好像已经有四年没有更新了。找了一下crack的文章,说这个软件破解不好会直接破坏系统,因此没有人破解。由于四年过了,现在已经可以搜到完美破解版,但是不是真的完美呢?要是有一点不完美,系统就要挂了,怕怕。所以先不用了,要用也在vmware里用。
thank creese@newsmth.


