日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

使用VC2005一些问题及解决方案

發布時間:2024/8/1 c/c++ 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用VC2005一些问题及解决方案 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

首先是我使用VC2005在不通階段的不通感受:

剛開始安裝VS2005時候感覺:真是大啊!裝了我一個上午!!而且運行個VC有時能耗我好大的內存。。

剛使用VC2005時候的感受:界面挺不錯,貌似功能更強大,對C++標準支持的很好,還可以用我最喜歡的Comic Sans MS字體,還支持代碼收縮等等。。雖然比較慢,但是不像VC6.0那樣老是出現編譯死機的情況。

開始用VC2005學習寫東西的時候的感受:實在沒有6.0好用,限制太多,很多地方跟VC6.0不一樣,而且很多功能似乎都找不到了。。還不如6.0方便。。。

使用一段時間的感受:雖然經常遇到問題但是都是有很好的解決方案的,而且相對6.0,2005的BUG少很多,總體來說如果機器配置還算可以的話,用2005是挺不錯的。。

下面就是我使用VC2005遇到的以及解決了的問題:

VC遇到的以及解決了的問題

1,對于Radio控件如何正確設置屬性Group?

首先要確保幾個Radio控件的Tab是按順序的(可以在對話框編輯器中按Ctrl+D將三個控件TABORDER設置在一起)。然后對第一個Radio控件選擇Group屬性,其他的不用選。對第一個

控件添加關聯變量int m_test,并且設置初值-1,則當我們點擊第一個控件m_test值是0,點擊第二個m_test值是1....依此類推。


2,VC2005中添加虛函數問題:

在VC6.0中可以對類右鍵添加虛函數,在VC2005中需要在類屬性中點擊一個重寫按鈕,在那里添加虛函數。


3,VC2005動態添加右鍵菜單問題:

在VC6.0中我們可以在Project->Add To Project->Component and Control中添加組件,如添加Pop-up Menu可以實現添加右鍵快捷菜單的功能。但是在VC2005中我們沒有這個功能

,但是我們可以手動自己添加,也不是很復雜。步驟如下(假設工程是一般MFC視圖工程命名Menu):

1,自己添加一個Menu資源,例如命名為IDR_MENU1,編輯之。頂級菜單是不出現的我們可以隨便設置不妨為abc。然后添加兩個彈出菜單項:顯示(IDM_SHOW)和退出(IDM_EXIT).
2,給CMenuView類中添加WM_RBUTTONDOWN消息的響應函數。代碼如下:
void CMenuView::OnRButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息處理程序代碼和/或調用默認值
CMenu menu;
menu.LoadMenuA(IDR_MENU1);
CMenu* pPopup = menu.GetSubMenu(0);
ClientToScreen(&point);?? //客戶坐標轉換成屏幕坐標
pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, this);

CView::OnRButtonDown(nFlags, point);
}
對菜單項添加事件很Easy。動態菜單添加主要用到如下的函數:
BOOL AppendMenu(UINT nFlags, UINT_PTR nIDNewItem = 0, LPCTSTR lpszNewItem = NULL);


4,下面轉帖自:
http://hi.baidu.com/freedomknightduzhi/blog/item/60a5012e512bba554fc226e9.html

惡心的2005


用VC2003一直很爽,到新公司要用2005,早聽說其檢查嚴格,沒想到,完全是沒事找事型的編譯器.

且不說滿屏幕的:

"警告 4 warning C4819: 該文件包含不能在當前代碼頁(936)中表示的字符。請將該文件保存為 Unicode 格式以防止數據丟失 "

運行個MFC的東西就報"由于應用程序的配置不正確,應用程序未能啟動"

一查才知道,這是05的特權,缺少動態庫也不說,直接報個配置不正確,Fuck.不如直接彈出個警告框"程序無法運行"適用性更大呢.

這里是重置2005配置的方法:

命令行輸入:devenv /resetuserdata

[[

開始執行程序時出現錯誤提示:
沒有找到MSVCP80D.dll,因此這個應用程序未能啟動。重新安裝應用程序可能會修復此問題。

解決方法:

項目->屬性->配置屬性->清單工具->常規->使用FAT32解決辦法
改為“是”即可

此時,應該將上次產生的debug文件夾刪除才能正確運行。

]]

原因大致是由于2005編譯時,FAT32格式硬盤會給程序加以時間戳,換機器運行時由于時間戳不符的原因導致無法運行,如果編譯機器格式為NTFS格式則也不會出現該問題。

這兩天有點焦頭爛額, 我們這邊運行的好好的程序, 到了測試的機器上就不能啟動(是根本運行不了, 而不是運行出錯), 弄得我異常郁悶。 經過了一番摸索, 發現和 winxp、

win2003中為解決dll hell而引入的manifest機制有關系。而以前我們用vs2003開發, 它并沒有強制程序使用manifest, 但到了vs2005中, 這已經改成必需的了, 而我們并沒有按照

需要進行相關的配置, 所以程序啟動不了了。 根據目前的經驗, vs2005編譯的程序不能啟動大致有兩個原因, 下面簡單介紹解決辦法。
1、在開發組的機器上(安裝有vs2005)有時都不能啟動
這一般是項目的文件被放在了fat/fat32分區上導致的, 解決方法是把它們都移動到ntfs分區上, 或者把“項目屬性|Manifest Tool|General|Use FAT32 Work-around”設為yes。
2、開發組運行正常, 換到其它機器上就不行了
這一般就是系統dll(包括crt,mfc,atl等)沒有正確配置導致的。 如果程序是release版, 那么很簡單, 只要把“\SDK\v2。0\BootStrapper\Packages\vcredist_x86”下

的"vcredist_x86。exe"拷貝到目標機器上運行即可, 這是以x86平臺為例的, 如果你用的是別的cpu平臺(amd64或ia64)把x86替換成相應的內容就可以了。

注:[[ ]] 內信息轉自http://hi.baidu.com/crafter%5Fxmu/blog/item/104040b44b4876768bd4b281.html

這里是"general error c101008a: Failed to save the updated manifest to the file "網上普遍的解決方法:

在用vs2005時,默認編碼為unicode,如果在項目中途改變,則編譯時會碰到錯誤general error c101008a: Failed to save the updated manifest to the file

".\Debug\Menu.exe.embed.manifest". Bpcn mt.exe .這時清理解決方案,再重新生成項目便可解決.

這里是"warning C4819: 該文件包含不能在當前代碼頁(936)中表示的字符。請將該文件保存為 Unicode 格式以防止數據丟失 "網上普遍的解決方法:

一般來說,這個警告沒有什么影響。要想去掉這個警告的方法有:

(1)轉換Code文件為Unicode格式;

(2)在Project -> Properties -> Configuration Properties -> C/C++ -> Advance 的 Disable Specific Warnings 中添加相應的警告編號:4819;

(3)或找出不符合Unicode格式的文件,然后在該文件的開始處加入下面的語句:

??????? # pragma warning (disable:4819)

2005斷點無法命中的解決方案

1:重新編譯該工程.

2:文件的編碼格式不匹配造成的;修改步驟: 菜單->文件->XXX文件另存為->編碼保存(保存按鈕旁邊的下拉菜單)->Unicode (UTF-8 帶簽名)->確定

這里是"由于應用程序的配置不正確,應用程序未能啟動"網上普遍的解決方法:

方法一:在類似C:\Program Files\Microsoft Visual Studio 8\VC\redi st\Debug_NonRedist\x86\Microsoft.VC80.DebugCRT 下找到了下列文件: msvcm80d.dll msvcp80d.dll

msvcr80d.dll Microsoft.VC80.DebugCRT.manifest 把這幾個文件拷貝到目標機器上,與運行程序同一文件夾或放到system32下,就可以正確運行了。 其他release版、MFC程序什

么的都是拷redist下相應文件夾下的文件就可以了,文件夾后都有標識!

結果: 把這幾個Dll Copy過去,無效....

方法二:工程-》屬性-》配置屬性-》c/c++ -〉代碼生成里,修改運行時庫選項,將/MD或/MDd 改為 /MT或/MTd,這樣就實現了對VC運行時庫的靜態鏈接,在運行時就不再需要

VC的dll了。

結果:由于我的程序使用了DLL輸出,使用多線程調試是不行的,必須多線程調試DLL,這招也無效....

方法三: 工程-》屬性-》配置屬性-》常規-》MFC的使用,選擇“在靜態庫中使用mfc” 這樣生成的exe文件應該就可以在其他機器上跑了。

結果: 告訴我缺少Boost庫,編譯一次Boost夠我吃頓飯回來了- -

方法四: 你的vc8安裝盤上找到再分發包vcredist_xxx.exe和你的程序捆綁安裝

結果: 搜索都沒搜到該EXE,誰叫咱用的是盜版...

最終沒有解決,下午再說.TMMD,2005.

解決了:

期間發生的問題包括:

1: Ogre的2005 Debug版本無法在其他機器上運行

錯誤描述為:”應用程序配置不正確……”

解決方法為:

需要開發者安裝430MB左右的VS80sp1-KB926604-X86-CHS.exe庫。

需要使用者安裝2.59MB的VCRedist_x86.exe庫。

2: Ogre的2005 Debug版本無法在其他機器上運行

錯誤描述為:” 應用程序正常初始化(0xc150002)失敗”

解決方法為:

需要開發者安裝430MB左右的VS80sp1-KB926604-X86-CHS.exe庫。

需要使用者安裝2.59MB的VCRedist_x86.exe庫。

3:安裝VCRedist_x86.exe庫時報錯

錯誤描述為:”Command Line option syntax error, Type Command /? For help”

解決方法為:

自己從VC2005目錄下找到運行時目錄,將其dll庫拷貝出來,粘貼到應用程序目錄下。


結論:
所以,想要運行2005編譯后的Ogre引擎支持的相關Demo,盡量做到以下兩點:

1:給予Release 版本

2:將VC運行時庫的動態連接庫一起拷貝過去。

1,控件和變量相關聯之后,沒有發生數據交換:

當控件和一個變量相關聯之后,控件與成員變量的數據交換是通過DoDataExchange函數來完成的,然而程序中并不直接調用這個函數,二十通過調用UpdateData函數來調用它的!!UpdateData函數是的參數是TRUE的時候從空間得到成員變量的值,參數是FALSE時候,使用成員變量的值初始化控件。


2,在VC2005中如何添加WM_INITDIALOG響應

這個響應應該是重寫虛函數:OnInitDailog()來獲得。


3, 在VC2005中給工具欄按鈕添加消息映射的方法

在VC6.0中很簡單類向導直接添加就行了,但是在VC2005中無論屬性頁中還是右鍵點擊都不能添加消息事件處理,只有兩種方法:

1,按照類向導添加的代碼自己寫就行了,三個需要修改的地方,函數聲明,消息映射,函數定義。
2,在菜單中建立同樣ID的菜單項,通過這個菜單項來添加。

開始我很郁悶,這么麻煩,后來想想這個修改也是為了程序的嚴格,直白說就是工具欄的按鈕都應該和菜單欄的功能對應才好。


4, VC中刪除工具欄按鈕

按Delete鍵只能清除按鈕圖標的顏色,要刪除按鈕只要把按鈕用鼠標拖出工具欄就行了。


5, VC中給菜單項添加復選標記

給當前按鈕添加一個UpdateView的事件處理,如下:

void CMainFrame::OnUpdateViewNewtoolbar(CCmdUI *pCmdUI)
{
// TODO: 在此添加命令更新用戶界面處理程序代碼
pCmdUI->SetCheck(m_newToolBar.IsWindowVisible());
}


6,在VC2005中自定義一個消息時候出現錯誤:error C2440: “static_cast”: 無法從“void (__thiscall CMainFrame::* )(void)”轉換為“LRESULT (__thiscall CWnd::* )(WPARAM,LPARAM)”的問題解決:

在定義時候我就是用:

頭文件MainFrm.h:??
???
#define?? UM_PROGRESS?? WM_USER+1?? //定義消息??
???
afx_msg?? void?? OnProgress();?? //?? 生成的消息映射函數??
???
源文件MainFrm.cpp:??
???
//消息映射??
BEGIN_MESSAGE_MAP(CMainFrame,?? CFrameWnd)??
ON_MESSAGE(UM_PROGRESS,OnProgress)??
END_MESSAGE_MAP()??
???
//消息實現??
void?? CMainFrame::OnProgress()??
{??
//todo:??
}??

然后出現如上的錯誤原因是: VC6.0編譯器有個BUG,就是允許你用:afx_msg void OnProgress();我們應該把函數改成LRESULT OnProgress(WPARAM, LPARAM).
這樣問題就解決了。然而MFC中一些向導生成的有許多是用void的,其實這個很多是繼承了虛函數的,具體要參見MFC底層代碼。注意定義函數時候的返回值(返回一個0就行)。

7,一個優先級注意的地方:
(CMainFrame*)GetParent()->m_wndStatusBar.SetWindowText(str);意味著:(CMainFrame*)(GetParent()->m_wndStatusBar.SetWindowText(str))。
所以要是調用CMainFrame的m_wndStatusBar,應該:((CMainFrame*)GetParent())->m_wndStatusBar.SetWindowText(str);還注意m_wndStatusBar的訪問權限要是public。


8,如何讀取一個Eidt控件里面多行的浮點數據,并將它每行存到一個Vector容器中。

CString strLine;
int lineCount, lineLen;
vector<double> array;

lineCount = m_edit.GetLineCount();
this->m_calculate.array.clear();

for (int i = 0; i < lineCount; i++)
{
?? lineLen = m_edit.LineLength(m_edit.LineIndex(i))+1;
?? m_edit.GetLine(i, strLine.GetBuffer(lineLen), lineLen);
?? strLine.ReleaseBuffer(lineLen);
?? this->m_calculate.array.push_back(atof(strLine));
}

注意:上面的代碼參考自MSDN:http://msdn.microsoft.com/zh-cn/library/s7zy7cwk(VS.80).aspx,但是,源代碼中第10行是:
lineLen = m_edit.LineLength(m_edit.LineIndex(i))
這是每當第一行數據只有1位的時候,例如5,變成了0。我加了一個1,之后就沒有類似問題了。


9,下面附加一些MFC中和標準庫中類型轉換的問題:

CString轉換為int, double...
int: _wtoi(CString*) long int: _wtol(CString*) double/float: _wtof(Cstring*)

CString和double相互轉換:
CString m;
double num = atof(m);
m.format("%f",num);

?

10,有關C++ int,char,string,CString類型轉換

轉自: http://blog.sina.com.cn/s/blog_4c22ff8d01000ati.html [查看原文]

C++ int,char,string,CString類型轉換(整理總結)

#include <string> //使用C++標準庫的string類時
using namespace std; //同上

#include <sstream>
#include <iostream>
#include <stdlib.h>??? //要將string類和int類型直接轉換最好有這些包含,

?????????????????????? //因為自己寫一個轉換函數比較方便,函數定義參考如下

string getstring ( const int n )

{

??? std::stringstream newstr;
??? newstr<<n;
??? return newstr.str();

}????????????

string 轉 CString
CString.format(”%s”, string.c_str());

char 轉 CString
CString.format(”%s”, char*);

char 轉 string
string s(char *);

string 轉 char *
char *p = string.c_str();

CString 轉 string
string s(CString.GetBuffer());

1,string -> CString
CString.format(”%s”, string.c_str());
用c_str()確實比data()要好.
2,char -> string
string s(char *);
只能初始化,在不是初始化的地方最好還是用assign().
3,CString -> string
string s(CString.GetBuffer());
GetBuffer()后一定要ReleaseBuffer(),否則就沒有釋放緩沖區所占的空間.

《C++標準函數庫》中說的
有三個函數可以將字符串的內容轉換為字符數組和C―string
1.data(),返回沒有”\0“的字符串數組
2,c_str(),返回有”\0“的字符串數組
3,copy()

―――――――――――――――――――――

CString與int、char*、char[100]之間的轉換- -

CString與int、char*、char[100]之間的轉換- -

CString互轉int

將字符轉換為整數,可以使用atoi、_atoi64或atol。
而將數字轉換為CString變量,可以使用CString的Format函數。如
CString s;
int i = 64;
s.Format(”%d”, i)
Format函數的功能很強,值得你研究一下。

void CStrDlg::OnButton1()
{
// TODO: Add your control notification handler code here
CString
ss=”1212.12″;
int temp=atoi(ss);
CString aa;
aa.Format(”%d”,temp);
AfxMessageBox(”var is ” + aa);
}

sart.Format(”%s”,buf);

CString互轉char*

///char * TO cstring
CString strtest;
char * charpoint;
charpoint=”give string a value”;
strtest=charpoint;

///cstring TO char *
charpoint=strtest.GetBuffer(strtest.GetLength());

標準C里沒有string,char *==char []==string

可以用CString.Format(”%s”,char *)這個方法來將char *轉成CString。要把CString轉成char *,用操作符(LPCSTR)CString就可以了。

CString轉換 char[100]

char a[100];
CString str(”aaaaaa”);
strncpy(a,(LPCTSTR)str,sizeof(a));


總結

以上是生活随笔為你收集整理的使用VC2005一些问题及解决方案的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。