#
故障現象:XP系統 TL-WN322G+ USB 網卡 系統自帶撥號上網后,查看PPS網絡電視,就死機;
故障點: XP ADVAPI32.dll SS:變成0 索引無效內存 00000074;
故障原因:系統自帶的撥號軟件和硬件不匹配;
解決方法:新裝撥號軟件 WinPoET v6.0;
在北京快3年了,我一直住公司提供的住處。說好呢,說不上,宿舍就是一個上班累了,回去休息的地方。
這3年來公司的宿舍,從203號房間開始一直到215號房間基本上都住過。認識了很多有趣的朋友,這是最大的
收獲。
上星期,跟大姐一起住的母親打來一個電話,說大姐因事要出遠門,需要跟我住一起。母親身體欠佳,我
做兒子的,很痛快地答應了。
故事就是這樣開始了。
上班以后我再網上搜索很多租房信息,并一個一個打電話咨詢。結果都是中介,若入住給中介一個月的房費。
啊,這幫中介太可惡了,這樣一個破信息,收這么多錢。打電話n個都是同樣的結果。
一個普通的上班族,能剩就剩(除非我中了頭彩)。為了剩一個月房費,我決定開始自己尋找房東。
首先我寫了一個廣告條《誠心求租一室一廳 電話:**********》,在公司里打印出了10多張。下班,吃晚飯
后我一個坐車到那個小區,在小區的廣告欄里貼了一張,有一個保安來,跟我說《這里不許亂貼東西》,我排排他
的肩膀說,《小弟我急需找房子,就貼一天。》。那個保安瞅著很年輕,就笑了一眼回去了。總算貼了一張,我
又到了第2個小區,已進門,哪里的保安長地非常魁梧,我就問他,《這里,居民委員會在哪里?》,我按他指向的
方向走過去了,天還沒有完全黑下來。我看看周圍沒有人,我又拿起我的小紙條,背面圖滿了固體膠水,啪,貼上了。
我要轉身的時候,后面有人喊《你干什么,這里也敢亂貼東西》,他瞪著我看,我說《大哥,我這不找房...》,那位
大哥說《這樣的你給超市的老板就可以,去吧。》,結果那位像村委會干部的人允許讓我在哪里貼我的小紙條,并
勸我下次不允許這樣。這樣第2張也貼上去了。然后我想,這樣貼也不是辦法,就在小區里開始尋找小賣店,一見小
老板就遞給我的紙條《老板,可以把這個紙條放這里嗎?》,結果一半以上的老板都拒絕。忙乎了一個多小時,送出
5張紙條。到了第2天,能有一兩個電話的希望,完全破滅了。唉...
那位高手請說明下面的代碼是做什么用的。
???? (defun pi-inv (bits &aux (m 0))
?????? (declare (integer bits m))
?????? (let* ((n (+ bits (integer-length bits) 11))
????????????? (tt (truncate (ash 1 n) 882))
????????????? (d (* 4 882 882))
????????????? (s 0))
???????? (declare (integer s d tt n))
???????? (do ((i 2 (+ i 2))
????????????? (j 1123 (+ j 21460)))
???????????? ((zerop tt) (cons s (- (+ n 2))))
?????????? (declare (integer i j))
???????????? (setq s (+ s (* j tt))
?????????????????? m (- (* (- i 1) (- (* 2 i) 1) (- (* 2 i) 3)))
?????????????????? tt (truncate (* m tt) (* d (the integer (expt i 3))))))))
HidServClass:HID Input Service
HidPhoneNotifClass:
MdmDevChg:ModemDeviceChange
BadApplicationNotificationWindowClass:BadApplicationNotificationWindow
SAGEWINDOWCLASS:SYSTEM AGENT COM WINDOW
NewIrmonClass:
Tapi32WndClass:
摘要: unsigned???char*???_stdcall???Base64Encode(const???char???*str
,
int???length)?{???????//int???length???
=
???strlen(str)
;
?
????static???char??...
閱讀全文
我用NtQueryInformationFile 或 GetMappedFileName 只能得到 磁盤文件名,
不能得到設備名,比如:COM1等。
是否還有其他方法能得到COM1?
NtQueryObject
能得到設備名,不過通過注冊表才能判定那個串口。
HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM\
微軟電話面試總結
---主要是如何答考試題---
微軟電話面試中不可缺少的部分,就是讓你在一段時間內讓你寫代碼,面試時考官給你郵箱地址,并把考試題發到你的郵箱里。應該如何答題,如果我的意見有問題請大家一起探討。
1.你的電腦上必須有編譯環境,并能做調試你寫的代碼。
2.接到考試題以后,先搞清楚問題,然后分析解決問題的思路。
3.如果在一定的時間內未能完成答題,就面試結束之后,抓緊時間,把正確的答案給考官。這點是不是很明知的選擇請大家評論。
我接到的題目是:
有整形數組 {1,1,2,3,3,5} ,去掉重復數結果是{1,2,3,5}并返回個數4。
思路大家自己想想
int compact(int
*p,int size)
{
int i,j;
int count = 1;
if(p == NULL) return -1;
if(size <= 0) return 0;
if(size == 1) return 1;
for(i = 1; i < size - 1;i++)
{
if(*(p + i) == *p) continue;
for(j = i+1;j<size;j++)
{
if(*(p+i) == *(p+j))
*(p+j) =
*p;
}
}
for(i = 1; i < size;i++)
{
if(*(p+i) != *p)
*(p+count++)=*(p+i);
}
return count;
}
線程中傳遞變量的問題
初次寫多線程編程的時候,初學者很容易犯的錯就是給線程傳遞變量的時候經常出錯,
因為線程中被傳遞的變量的類型不同,其效果也不一樣。經常采用的是分配新的內存給變
量,傳遞這個新分配的內存地址,因為同一個變量名,但是指向的內存段不同,這樣能實
現正確地給多線程傳遞變量,注意的是在每一個線程結束的時候一定要把這個分配的內存
釋放。
HANDLE mt[1000];
for(int i=0;i<50;i++)
{
pTI pti = new TI;
pti->pDlg = this;
pti->id = i;
pti->me = pti; //把自身的指針帶過去
pClockThread[i] = AfxBeginThread(ClockThread,pti);
mt[i] = pClockThread[i]->m_hThread;
ResumeThread(pClockThread[i]->m_hThread);
}
DWORD dw = WaitForMultipleObjects(3,mt,TRUE,INFINITE);
UINT ClockThread( LPVOID pParam )
{
pTI pti;
pti =(pTI) pParam;
CClockDlg *pDlg = (CClockDlg *)pti->pDlg;
CString str;
str.Format("log%02d.txt",pti->id);
FILE *fp;
fp = fopen(str,"wb");
for(int m=0;m<100;m++)
{
CTime t = CTime::GetCurrentTime();
str.Format("id = %02d %02d:%02d.%02d",pti->id,t.GetHour(),t.GetMinute(),t.GetSecond());
fwrite(str+"\r\n",1,str.GetLength()+2,fp);
CDC *pDC = pti->pDlg->GetDC();
if(pDC)
{
pDC->TextOut(20,pti->id*16,str);
pDlg->ReleaseDC(pDC);
}
Sleep(100);
}
fclose(fp);
delete pti->me;//釋放內存
AfxEndThread(0,TRUE);
return 0;
}
step1:Create Blank Workspace add two project DLL and TestDll
step2:DLL Project
1.Project Settings -> C/C++ ->Debug info ->Program Database for Edit and Continue
2.Project Settings -> Link ->Check Generate debug info check box
step3:TestDll Project
1.Project Settings ->Debug ->Excutable for debug session ->input dir and filename
2.Project Settings ->Debug ->Working directory -> input dir
3.Project Settings ->Link ->Output file name ->input dir and filename
4.Project Settings ->link ->Object/library modules->input dll.lib
DLL
class AFX_EXT_CLASS TestClass
{
public:
void MsgBox(CString str);
TestClass();
virtual ~TestClass();
};
void TestClass::MsgBox(CString str)
{
AfxMessageBox(str); //Add breakpoint
}
概述
調試是一個程序員最基本的技能,其重要性甚至超過學習一門語言。不會調試的程序員就意味著他即使會一門語言,卻不能編制出任何好的軟件。
這里我簡要的根據自己的經驗列出調試中比較常用的技巧,希望對大家有用。
本文約定,在選擇菜單時,通過/表示分級菜單,例如File/Open表示頂級菜單File的子菜單Open。
設置
為了調試一個程序,首先必須使程序中包含調試信息。一般情況下,一個從AppWizard創建的工程中包含的Debug Configuration自動包含調試信息,但是是不是Debug版本并不是程序包含調試信息的決定因素,程序設計者可以在任意的Configuration中增加調試信息,包括Release版本。
為了增加調試信息,可以按照下述步驟進行:
* 打開Project settings對話框(可以通過快捷鍵ALT+F7打開,也可以通過IDE菜單Project/Settings打開)
* 選擇C/C++頁,Category中選擇general ,則出現一個Debug Info下拉列表框,可供選擇的調試信息 方式包括:
命令行 Project settings 說明
無 None 沒有調試信息
/Zd Line Numbers Only 目標文件或者可執行文件中只包含全局和導出符號以及代碼行信息,不包含符號調試信息
/Z7 C 7.0- Compatible 目標文件或者可執行文件中包含行號和所有符號調試信息,包括變量名及類型,函數及原型等
/Zi Program Database 創建一個程序庫(PDB),包括類型信息和符號調試信息。
/ZI Program Database for Edit and Continue 除了前面/Zi的功能外,這個選項允許對代碼進行調試過程中的修改和繼續執行。這個選項同時使#pragma設置的優化功能無效
* 選擇Link頁,選中復選框"Generate Debug Info",這個選項將使連接器把調試信息寫進可執行文件和DLL
* 如果C/C++頁中設置了Program Database以上的選項,則Link incrementally可以選擇。選中這個選項,將使程序可以在上一次編譯的基礎上被編譯(即增量編譯),而不必每次都從頭開始編譯。
斷點
斷點是調試器設置的一個代碼位置。當程序運行到斷點時,程序中斷執行,回到調試器。斷點是 最常用的技巧。調試時,只有設置了斷點并使程序回到調試器,才能對程序進行在線調試。
設置斷點:可以通過下述方法設置一個斷點。首先把光標移動到需要設置斷點的代碼行上,然后
* 按F9快捷鍵
* 彈出Breakpoints對話框,方法是按快捷鍵CTRL+B或ALT+F9,或者通過菜單Edit/Breakpoints打開。打開后點擊 Break at編輯框的右側的箭頭,選擇 合適的位置信息。一般情況下,直接選擇line xxx就足夠了,如果想設置不是當前位置的斷點,可以選擇Advanced,然后填寫函數、行號和可執行文件信息。
去掉斷點:把光標移動到給定斷點所在的行,再次按F9就可以取消斷點。同前面所述,打開Breakpoints對話框后,也可以按照界面提示去掉斷點。
條件斷點:可以為斷點設置一個條件,這樣的斷點稱為條件斷點。對于新加的斷點,可以單擊Conditions按鈕,為斷點設置一個表達式。當這個表達式發生改變時,程序就 被中斷。底下設置包括“觀察數組或者結構的元素個數”,似乎可以設置一個指針所指向的內存區的大小,但是我設置一個比較的值但是改動 范圍之外的內存區似乎也導致斷點起效。最后一個設置可以讓程序先執行多少次然后才到達斷點。
數據斷點:數據斷點只能在Breakpoints對話框中設置。選擇“Data”頁,就顯示了設置數據斷點的對話框。在編輯框中輸入一個表達式,當這個 表達式的值發生變化時,數據斷點就到達。一般情況下,這個表達式應該由運算符和全局變量構成,例如:在編輯框中輸入 g_bFlag這個全局變量的名字,那么當程序中有g_bFlag= !g_bFlag時,程序就將停在這個語句處。
消息斷點:VC也支持對Windows消息進行截獲。他有兩種方式進行截獲:窗口消息處理函數和特定消息中斷。
在Breakpoints對話框中選擇Messages頁,就可以設置消息斷點。如果在上面那個對話框中寫入消息處理函數的名字,那么 每次消息被這個函數處理,斷點就到達(我覺得如果采用普通斷點在這個函數中截獲,效果應該一樣)。如果在底下的下拉 列表框選擇一個消息,則每次這種消息到達,程序就中斷。
值
Watch
VC支持查看變量、表達式和內存的值。所有這些觀察都必須是在斷點中斷的情況下進行。
觀看變量的值最簡單,當斷點到達時,把光標移動到這個變量上,停留一會就可以看到變量的值。
VC提供一種被成為Watch的機制來觀看變量和表達式的值。在斷點狀態下,在變量上單擊右鍵,選擇Quick Watch, 就彈出一個對話框,顯示這個變量的值。
單擊Debug工具條上的Watch按鈕,就出現一個Watch視圖(Watch1,Watch2,Watch3,Watch4),在該視圖中輸入變量或者表達式,就可以觀察 變量或者表達式的值。注意:這個表達式不能有副作用,例如++運算符絕對禁止用于這個表達式中,因為這個運算符將修改變量的值,導致 軟件的邏輯被破壞。
Memory
由于指針指向的數組,Watch只能顯示第一個元素的值。為了顯示數組的后續內容,或者要顯示一片內存的內容,可以使用memory功能。在 Debug工具條上點memory按鈕,就彈出一個對話框,在其中輸入地址,就可以顯示該地址指向的內存的內容。
Varibles
Debug工具條上的Varibles按鈕彈出一個框,顯示所有當前執行上下文中可見的變量的值。特別是當前指令涉及的變量,以紅色顯示。
寄存器
Debug工具條上的Reigsters按鈕彈出一個框,顯示當前的所有寄存器的值。
進程控制
VC允許被中斷的程序繼續運行、單步運行和運行到指定光標處,分別對應快捷鍵F5、F10/F11和CTRL+F10。各個快捷鍵功能如下:
快捷鍵 說明
F5 繼續運行
F10 單步,如果涉及到子函數,不進入子函數內部
F11 單步,如果涉及到子函數,進入子函數內部
CTRL+F10 運行到當前光標處。
Call Stack
調用堆棧反映了當前斷點處函數是被那些函數按照什么順序調用的。單擊Debug工具條上的Call stack就顯示Call Stack對話框。在CallStack對話框中顯示了一個調用系列,最上面的是當前函數,往下依次是調用函數的上級函數。單擊這些函數名可以跳到對應的函數中去。
其他調試手段
系統提供一系列特殊的函數或者宏來處理Debug版本相關的信息,如下:
宏名/函數名 說明
TRACE 使用方法和printf完全一致,他在output框中輸出調試信息
ASSERT 它接收一個表達式,如果這個表達式為TRUE,則無動作,否則中斷當前程序執行。對于系統中出現這個宏 導致的中斷,應該認為你的函數調用未能滿足系統的調用此函數的前提條件。例如,對于一個還沒有創建的窗口調用SetWindowText等。
VERIFY 和ASSERT功能類似,所不同的是,在Release版本中,ASSERT不計算輸入的表達式的值,而VERIFY計算表達式的值。
關注
一個好的程序員不應該把所有的判斷交給編譯器和調試器,應該在程序中自己加以程序保護和錯誤定位,具體措施包括:
* 對于所有有返回值的函數,都應該檢查返回值,除非你確信這個函數調用絕對不會出錯,或者不關心它是否出錯。
* 一些函數返回錯誤,需要用其他函數獲得錯誤的具體信息。例如accept返回INVALID_SOCKET表示accept失敗,為了查明 具體的失敗原因,應該立刻用WSAGetLastError獲得錯誤碼,并針對性的解決問題。
* 有些函數通過異常機制拋出錯誤,應該用TRY-CATCH語句來檢查錯誤
* 程序員對于能處理的錯誤,應該自己在底層處理,對于不能處理的,應該報告給用戶讓他們決定怎么處理。如果程序出了異常, 卻不對返回值和其他機制返回的錯誤信息進行判斷,只能是加大了找錯誤的難度。
另外:VC中要編制程序不應該一開始就寫cpp/h文件,而應該首先創建一個合適的工程。因為只有這樣,VC才能選擇合適的編譯、連接 選項。對于加入到工程中的cpp文件,應該檢查是否在第一行顯式的包含stdafx.h頭文件,這是Microsoft Visual Studio為了加快編譯 速度而設置的預編譯頭文件。在這個#include "stdafx.h"行前面的所有代碼將被忽略,所以其他頭文件應該在這一行后面被包含。
對于.c文件,由于不能包含stdafx.h,因此可以通過Project settings把它的預編譯頭設置為“不使用”,方法是:
* 彈出Project settings對話框
* 選擇C/C++
* Category選擇Precompilation Header
* 選擇不使用預編譯頭。