顯示具有 PV3Tool 標籤的文章。 顯示所有文章
顯示具有 PV3Tool 標籤的文章。 顯示所有文章

2010年6月7日 星期一

PV3Tool Bug?

最近用PV3Tool的時候在離開程式時都會出現Access Violation...。
查了一下是ntdll.dll裡的function產生的..。

會出現這問題主要是在有作過抓圖動作之後,
但有時候又不會有問題...。之前用那麼久PV3Tool也都沒發生過。

更神奇的是在Windows7裡沒這問題...。

真是詭異...。

2010年2月28日 星期日

PV3Tool final beta

PV3Tool beta修得差不多了,原本有人反應說toolbar按鈕會一直閃而且不能按,
也回報沒問題了。(不過我完全沒改半行code說......)
其實我一直覺得這問題是driver的關係,因為我這邊原本開發的機器跟新組的電腦,
兩台跑起來都沒問題,我也去挖了XP日文版來測試,也是一樣沒問題。

真要說改了什麼的話,就是有把一些跟字串有關的sizeof改成了_countof ... 該不會是
memory爆了什麼的造成這個問題吧XD...。只能說又學到東西了:)

另外就是修掉了載入電視台logo功能裡面讀檔會掛掉的問題,這算是當初在unicode化時
沒注意到就改了。因為logo檔那邊的檔頭還是用ascii code的,所以檔頭structure裡面的
char[]被我改成TCHAR[]後就會有問題。改回原本的char[]後就沒問題了。

再來我還加了個可以自由切換aero mode開關的功能。
因為我自己在windows7下用,錄影的結果很正常,但monitor的畫面都頓頓的。
關掉aero mode就正常了。看來aero mode是很漂亮,但也吃掉一些資源。

最後就只剩下OSD在Directdraw off-screen surface會一直被消掉造成閃爍的問題。
這個我想只能用個thread一直強迫重畫才行,不知道會吃掉多少cpu。

有興趣的人可以下載final beta
for winxp
for vista/windows7
source code

2010年2月25日 星期四

PV3Tool(續)

ok剛剛說按鈕有問題的人回報了 還錄了影片
看了一下 應該是更新按鈕state的部份有問題
或是timer的重畫時間太長
之前有試著改過timer時間為15ms畫一次
在off-screen surface下 osdbar不會一直閃
不過到了window7下因為aero的關係還是沒辦法解決
先丟一個timer 15ms的版本試試好了

如果還是有問題就要大改code了.....

PV3Tool

2ch那邊有人提到Clipboard的問題
稍微看一下code,發現原來我忘了改Clipboard的資料類型
原本是設定成ANSI TEXT,但因為整個程式都unicode化了
所以本來的檔案路徑也都變unicode了,所以抓圖完的Clipboard都會只有一個char
因為一般ascii code在unicode下都變成0x00??了,在記憶體裡排列就變成
?? 00,然後00剛好是null terminate,所以都只會有一個char

2000/XP之後有新的參數是可以指定Clipboard的資料內容是unicode text了,
改了之後就正常了,順便加上可以由ini/profile指定Clipboard字串format。
這樣應該就方便很多了。

不過有人說toolbar的按鈕問題解決了說XD
我根本沒動其它的code阿XD 要說其它修改的話,只有針對xp和windows7的def作修改
真是怪怪,不過沒問題就好,不然其實我也找不出原因orz
我換了兩台電腦都OK,想說再不行就只好灌日文XP來試了 XD
anyway, 沒問題就好:D

2010年2月19日 星期五

PV3Tool問題

2ch那邊有人提到不能按toolbar上的open memory等按鈕的問題..

..........我都可以耶XD..... 這是要怎麼debug... -.-||
只好暫時先擺放了,反正他們還有areya的版本可以用
我不用unicode版的話畫面會很亂而且會有當機bug

話說最近還發現windows7的winmm.dll export function的順序編號跟XP不一樣了
不過怎麼用起來沒差.... 為了保險起見,我還是改了def檔
免得出一些怪問題

請大家開始學寫unicode程式了,不然你的程式永遠只能給自己用

2010年2月10日 星期三

PV3Tool抓圖問題修正

會產生問題的原因是IDirectDrawSurface7::Lock()時會有SURFACE_BUSY的問題,加了一個新的參數MaxSnapShotRetry 讓程式在Lock有問題時可以重新再嘗試Lock

PV3Tool用Hook的方式... 這問題應該沒有好的解法吧

2010年2月5日 星期五

FindWindow與多語系 - 3

本來應該解決這個問題了
不過又半路殺出個程咬金

"另存新檔" -> 在xp, vista, windows7, 不管是x32或x64 中文版或日文版都能正確抓到字串

"開啟舊檔" -> 在xp, vista, windows7中 顯示出來是 "開啟舊檔"
但在windows7 中 comdlg32.dll裡存的字串卻是 "開啟" Orz

後來才發現 原來開啟舊檔的dialog應該是用dialog resource內#1547的dialog...
標題寫的正是"開啟舊檔"
不過打開其它的dialog 有的標題寫"開啟" 有的寫 "開啟舊檔"...... Orz

最後終於讓我用另一個方法解決這問題了
WM_ENTERIDLE會回傳給dialog的parent window
所以在parent window裡面攔這個message 其中的LPARAM就是dialog的handle了 -.-||
如果要確定是我們要的那個dialog 就用getdlgitemtext之類的檢查一下就好

2010年2月3日 星期三

FindWindow與多語系 - 2

今天終於解決(?)這個問題了

因為save dialog是依據comdlg32.dll來創造的,所以在comdlg32.dll中
就含有dialog對應的string resource

用visual studio開啟comdlg32.dll (個人是使用XP SP3)
可以看到resource id=385 就是我們要的 "另存新檔"

根據這個結果,寫了下面的程式:

LoadString((HINSTANCE)GetModuelHandle(_T("comdlg32.dll")), 385, buf, 1024);

這樣buf的內容就會是"另存新檔" 再丟給FindWindow就能找到我們要的dialog的handle

FindWindow(MAKEINTATOM(32775), buf) 這樣子就能找出SaveDialog的handle

vista下LoadString也能得到"另存新檔"字串
windows7下應該也沒有問題 而且在windows7下打開comdlg32.dll可以看到其它語系的string table
其它語系的"另存新檔" id也同樣是385
所以這個方法應該沒有問題吧... XD

現在要測試在64bits的os是否也能得到相同結果

>> 64bits OS OK!!

2010年2月2日 星期二

FindWindow與多語系

最近遇到一個問題
有支程式,原本是日本人開發的。有個部份是程式會去檢查是否有跳出"另存新檔"的視窗
如果有,程式會代替使用者按下"儲存"按鈕.. 原本的程式是這樣寫的

FindWindow(NULL, _T("名前を付けて保存"))

"名前を付けて保存"就是日本的另存新檔的意思
這樣子寫,在日文的作業系統下運作當然是沒有問題

但是到了中文的系統下就不行了 因為中文的系統下 另存新檔視窗的title就是"另存新檔"
所以程式如果不修改的話,FindWindow一定會找不到對應的視窗

當然改成FindWindow(NULL, _T("另存新檔"))這樣子就沒問題了
但是變成要維護兩份source 而且一但之後再增加新語言支援 又要再多一份source..

原本是想把這個字串放到resource裡面,不過resource editor好像原生不支援unicode
看起來打進去的字串 會依照我們設定的語言跟codepage存起來 等到compile time才會轉成unicode存起來..

而且看起來這個視窗的標題應該是系統內部有定義好 如果可以由程式拿到這個字串的話
就能解決這個問題了

2010年1月31日 星期日

win32 LoadString Function...

LoadString這個function可以用來載入某個instance裡面內含的string resource.
MSDN中對於nBufferMax參數有提到:
"If this parameter is zero, then lpBuffer receives a read-only pointer to the resource itself."

所以基本上我只要nBufferMax傳0進去.. lpBuffer就可以拿到我們指定的ID對應的string囉...

心裡這樣想,寫了下面的程式
LPTSTR haha = NULL;
LoadString(hInstance, IDS_HAHA100, haha, 0);

結果haha回來的值還是NULL (倒

難道msdn也會拐人嗎XDD

msdn有對這個技巧說明: 這個方法只能用在LoadStringW... 很好... 我寫的是unicode程式阿XDD
(都什麼時代了還在寫ansi...)
所以我的程式當然是call LoaodStringW...

google半天也不知所以然

思考了很久很久
突然想到
因為傳進去的是LPTSTR... 所以LoadString內部一定是copy一份這個變數的"值"進去 (call by value嘛)
然後在LoadString內對自己function內宣告的變數改得很高興 但是外面的變數根本就沒動阿XDD
所以應該是要傳LPTSTR的pointer進去給LoadString才對

不過LoadString只吃LPTSTR說...
改寫一下變成:
LoadString(hInstance, IDS_HAHA100, (LPTSTR)(&haha), 0);

喔喔喔喔喔喔 成功了
不過是沒有\0 (null-terminated char)的字串
要自己切

不過我記得有google到只要加/n參數在resource compiler那邊
編譯出來的resource就會含\0
不然就要自己切字串, LoadString會回傳ID對應的String長度
看是要執行檔resource肥一點點點 但跑比較快
還是執行檔code肥一點 然後要自己切字串 跑比較慢

恩 這樣搞定一個問題 很高興 :D