Search Google

Thursday, November 29, 2007

function pointer type


typedef HINSTANCE (__stdcall *PFreeLibrary)( HINSTANCE );


以上是宣告function pointer type的範例,
PGetProcAddress是指到接受HMODULE, LPCSTR,產出FARPROC型態變數的變數指標

使用時
PGetProcAddress SomeFuncPtr;
SomeFuncPtr = AnotherFunc;

AnotherFunc的實做為
HINSTANCE AnotherFunc(HMODULE aa, LPCSTR bb) {...}

Monday, November 26, 2007

Visual Studio 2008 Setup - Part1

最近與VS2005奮戰許久之後依舊無法克服部份WinAPI的困擾讓我決定啟用VS2008,沒想到一裝好之後之前遇到的問題通通不見了!
只是愈到了一個新的問題,那就是不知道該如何debug(以前都用gdb),稍微摸索之後終於讓我找到解決之道,下面是一些設定的screenshots。



[1] & [2]記得填寫


Saturday, November 24, 2007

gcc還是在Linux下用會比較好

最近在Windows上使用MinGW時遇到幾個挫敗:
1. 總是無法順利呼叫叫做SendInput的Win32 API,總是給我類似這樣的錯誤訊息

C:\Documents and Settings\user\My Documents\code\api_sendinput>make
gcc -I. -IC:\MinGW\include -g -mwindows -o api_sendinput.exe api_sendinput.o -
Wall -LC:\MinGW\lib -Lc:\MinGW\bin -luser32
api_sendinput.o: In function `main':
C:/Documents and Settings/user/My Documents/code/api_sendinput/api_sendinput.c:5
3: undefined reference to `SendInput'
collect2: ld returned 1 exit status
make: *** [api_sendinput.exe] Error 1

2. 今天寫了一個程式parse掃毒程式產生的Log file,執行後跟沒執行一樣,於是使用gdb除錯,進入gdb後我用set args給參數之後還沒設break point就馬上開始執行,結果跑出來的卻是正確的結果,同樣的src code丟到lab server上編譯過後執行的再正常不過。

所以gcc還是比較適合在Linux下使用。。。
話說從gcc轉換到VC++原來還是有overhead,原本gcc編譯的好好的code丟到VC++裡編譯的結果執行總是怪怪的,經過研究之後把#define換成宣告global variable才正常,而且有時候使用#define還會產生error,使用linux的list.h時就是一個例子。

現在電腦中的開發環境亂成一團,自己都快搞糊塗了,看來下星期再回覆重新來過吧!

Sunday, November 11, 2007

完成第一支使用win32 api的程式

今天完成了我生平第一支使用win32 api的程式,我叫他做autop2p
他的作用是控制滑鼠、鍵盤讀取檔案中的關鍵字,一一丟進p2p軟體的搜尋欄位後按下搜尋紐進行搜尋,過程中家齊學長在尋找適合的API方面幫了我很大的忙。
同時學到window handle與process handle雖然都是HWND type,但是是兩碼子事。
也在msdn上看到使用fscanf()一次scan一整行的方法:

fscanf(fIn, "%[^\n]%*c", keyWordBuf)

總體來說,autop2p的功能算是automate的一個小subset,使用automate多年之後總算也知道它是怎做出來的了!

Thursday, November 08, 2007

command for removing windows messenger

RunDll32 advpack.dll,LaunchINFSection %windir%\INF\msmsgs.inf,BLC.Remove

undefined reference to '_GetProcessId'

Got the w32api package installed in Cygwin, but the build process still doesn't go through.

w32api package installed

compilation error

Wednesday, November 07, 2007

cygwin's clear

安裝ncurses lib之後就可以在cygwin下執行clear清除畫面。
安裝路徑為:Libs --> ncurses
可以順道一起將libncurses*也裝起來 :-)

run DDD in cygwin

利用

x -multiwindow &
開啟x-server,
之後要記得
export DISPLAY=localhost:0
因為開啟x-server時預設的display是0,
接下來就可以快快樂樂的輸入
ddd &
開啟並使用ddd了。

Tuesday, November 06, 2007

mingw + winapi

古人云:小人恆立志
果然一點也沒錯!
今天學長告知隊上使用的p2p不只一種的同時也建議研究一下winapi
這樣只需要寫一個程式就可以控制多個p2p clients讓他們自動搜尋,
於是乎,我將改寫使用Java的LimeWire計畫置一旁,開始研究起winapi來,
又因為手上這台電腦的記憶體實在太少(256MB - 內建顯卡 = 240MB),
安裝VS系列可能會跑到死,所以決定走cygwin/mingw路線。
這個連結就是使用mingw編出呼叫winapi的執行檔introduction~
沒想到最後還是要碰以前打死都不想看的winapi@@

vim and cscope in windows

1. _vimr存放在"C:\Documents and Settings\[your_login]\"下

2. 使用cscope建立tag之前要先設定TMPDIR的path,不然不但不會有output,他連半點回應都不會給你, eg:

mkdir tmp
set TMPDIR=.\tmp

Sunday, November 04, 2007

重拾java?!

在PTT受到善心人士指點後得知foxy(不公開source code的可惡傢伙)"應該"是用gnutella protocolspec在此)搜尋檔案,因此特地google了一下這個神奇的protocol,發現眾多支援該protocol的clients中屬LimeWire支援得最齊全,因此決定用他來完成上級交付的任務:寫一個完全自動化的Foxy搜尋器(從輸入keywords到下載完全自動),只不過LimeWire是用java寫的,看來我又得重拾荒廢已久的java了嗎?
講到java,當然就要順道提一下eclipse!
今天也發現了一個解說如何用eclipse trace code的blog,對我接下來要完成的任務多少有點幫助。

Saturday, November 03, 2007

Use mget without answering Y/N

使用FTP的文字介面(eg. MS內建的ftp)抓多個檔案時就要使用mget指令,
但是要如何跳過回答Y/N而直接抓取檔案呢?
答案就是先輸入prompt將互動模式關掉,eg.

open [ip]
[login]
[passwd]
bin
prompt
mget *
quit

太久沒用都忘了@@

debug.exe

MS內建的debug.exe只支援到64KB大小的檔案,當檔案超過64KB的時候該怎麼辦呢?
很簡單,利用split之類的工具將binary file切割成多個64KB的檔案再使用debug.exe將這些檔案以hex格式dump出來,透過console傳到(眉角在此)目標主機上之後再利用debug所提供的db指令在debug將hex格式還原成binary file的時候把多個64KB檔案重新組合成為單一binary file(我知道有點繞口)。

主要的幾個步驟:
1. 將debug script餵給debug產生出第一個bin file, eg. debug < a.txt > a.bin
2. 使用debug開啟bin file, eg. debug a.bin
3. 在debug內移到a.bin的結尾
4. 使用db將其他幾個檔案的hex data倒到a.bin的後面,完成後記憶體中的內容就與原來的bin file一模一樣了!
5. 利用(1)的debug script中寫入檔案的指令將所有資料寫入b.bin
6. 完成
目前不確定(2)~(6)是否能夠寫到script讓debug自動執行,需要再做實驗&研究,eg.

debug a.bin < 3_to_6.script

以下幾個links有debug的相關資訊:
http://kipirvine.com/asm/debug/Debug_Tutorial.pdf
http://www.moon-soft.com/program/bbs/readelite553716.htm
http://www.itepub.net/html/kaifawendang/C__/wenjian_mulu_ziyuan/2006/0429/6758.html

Something about DOS and BAT

1. 在Dos下搜尋某個檔案並顯示full path的方式有幾種:

$ dir /s "file_name"
$ [drive: or path_2_folder\] && dir /s "file_name"
$ dir /s/b [drive: or path_2_folder\] | findstr "file_name"


2. BAT file中的每個statement必須寫在同一行,eg.
if ... () else ()
for %%i in () do ()

ps. ()等同C中的{}
%1~%9是input argument
%%x代表變數,x可為任何legal identifier
細節這裡有。