顯示具有 抱怨VC6 標籤的文章。 顯示所有文章
顯示具有 抱怨VC6 標籤的文章。 顯示所有文章

VCBUILD : warning C4727: PCH 問題

沒有留言:
release編譯出錯了!
訊息有:

VCBUILD : warning C4727: PCH named

加上很多很多的
error LNK2005

會是什麼原因呢?

如果,你有使用預先編譯好的.lib檔,再吃那些.lib檔再編,就要注意了。

不管是主要的專案,還是.lib的那個專案,都要做這樣的設定

在專案屬性>C\C++>Precompiled Headers>Create/Use Precompiled Header
設定成Not Using Precompiled Headers

就成功了。QQ

多核心編譯

沒有留言:
手動加入參數。

Project Properties>Configuration Properties>C/C++>Command Line>Additional options

加入
/MP4 (4核心)

幾核就用 /MP幾 唷!

此用法適用於....試了就知道。^^

參考資料:
[1] 加快Visual Studio 2005/2008的編譯速度
[2] /MP (Build with Multiple Processes)

VS2005 msvcprtd.lib(MSVCP80D.dll) : error LNK2005

沒有留言:
編譯完出現下面的訊息

1>msvcprtd.lib(MSVCP80D.dll) : error LNK2005: "public: __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::~basic_string<char,struct std::char_traits<char>,class std::allocator<char> >(void)" (??1?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@XZ) 已在 cppUnitMain.obj 中定義過了

1>msvcprtd.lib(MSVCP80D.dll) : error LNK2005: "public: __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" (??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@ABV01@@Z) 已在 cppUnitMain.obj 中定義過了

1>msvcprtd.lib(MSVCP80D.dll) : error LNK2005: "public: char const * __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::c_str(void)const " (?c_str@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEPBDXZ) 已在 cppUnitMain.obj 中定義過了

1>MSVCRTD.lib(ti_inst.obj) : error LNK2005: "private: __thiscall type_info::type_info(class type_info const &)" (??0type_info@@AAE@ABV0@@Z) 已在 LIBCMT.lib(typinfo.obj) 中定義過了

1>MSVCRTD.lib(ti_inst.obj) : error LNK2005: "private: class type_info & __thiscall type_info::operator=(class type_info const &)" (??4type_info@@AAEAAV0@ABV0@@Z) 已在 LIBCMT.lib(typinfo.obj) 中定義過了
1>MSVCRTD.lib(MSVCR80D.dll) : error LNK2005: "public: virtual __thiscall std::exception::~exception(void)" (??1exception@std@@UAE@XZ) 已在 LIBCMT.lib(stdexcpt.obj) 中定義過了

1>MSVCRTD.lib(MSVCR80D.dll) : error LNK2005: "public: __thiscall std::exception::exception(class std::exception const &)" (??0exception@std@@QAE@ABV01@@Z) 已在 LIBCMT.lib(stdexcpt.obj) 中定義過了
1>MSVCRTD.lib(MSVCR80D.dll) : error LNK2005: "public: __thiscall std::exception::exception(void)" (??0exception@std@@QAE@XZ) 已在 LIBCMT.lib(stdexcpt.obj) 中定義過了

1>LINK : warning LNK4098: 預設的程式庫 'MSVCRTD' 與其他使用的程式庫衝突,請使用 /NODEFAULTLIB:library


[1] 只要把編譯的RTTI打開就可以解決了!
[2] vs2005 專案檔設定>C/C++>Code Generation>RunTime Library,選Muti-threaded Debug DLL(參考)

參考資料:
[1] How to resolve linking error?
[2] VS2005中運行時庫不一致導致項目編譯出問題

VS編譯兩份執行檔

沒有留言:
情境:

我在公用電腦開了一個共享資料夾。
但是我的專案檔的source code不放在該資料夾上。
我的測試release和debug,要在本機上執行。
但是要保持給予使用者的程式是最新版的release。

在Visual Studio要怎麼設定?
在Project Properties > Configuration Properties > General > Output Directory,這個欄位設定編譯完放執行檔的位置。

注意: release設定和debug設定要不一樣。

這個欄位依這個格式設定
<path one>;<path two>

重點是「用分號當分隔,中間不可以有任何的空白」。

VS2005測試結果,Build會過,但是真正要output 執行檔時,竟然出現error。

function template裡使用vector和iterator

沒有留言:
一開始的程式碼是這樣
void Add(std::vector<double> _V)
{
    for (std::vector<double>::iterator _I = _V.begin(); _I != _V.end(); ++_I)
        add(*_I);
}
void Add(std::vector<CString> _V)
{
    for (std::vector<CString>::iterator _I = _V.begin(); _I != _V.end(); ++_I)
        add(*_I);
}
就想使用template將它們兩個合併成一組程式碼
template<class T> 
void Add(std::vector<T> _V)
{
    for (std::vector<T>::iterator _I = _V.begin(); _I != _V.end(); ++_I)
        add(*_I);
}
如果你也覺得這樣的程式碼沒問題,就值得繼續往下看,因為他complier一萬年也不會過!!


在Google「function template vector」之後,終於有結果了。[1]
template<typename T, typename A>
void some_func( std::vector<T,A> const& vec ) {}
但是還是不行!怎麼會這樣?!
這時,就讓我想起一句話

「M$不符合標準,因為他當自己就是標準」

所以,我就將程式碼改成這樣(測試平台: VC6)
template<class T> 
void Add(std::vector<T,std::allocator<T> > const & _V)
{
    for (std::vector<T>::iterator _I = _V.begin(); _I != _V.end(); ++_I)
        add(*_I);
}
就可以了!(哭哭)

但是,標準要怎麼寫呢?
我就使用MiniGW + Sublime text 2來測試一下
果然VC6的寫法不適合,那要怎麼改呢?

再Google「function template vector iterator」了一陣子,終於有結果了。[2]

改成下面這樣,就可以了!
#include <vector>
#include <iterator>
#include <string>
#include <iostream>

class Display
{
public:
    template < typename T, typename A >
    void Show( std::vector<T,A> const& vec )
    { 
        typename std::vector<T>::const_iterator it;
        for (it = vec.begin(); it != vec.end(); ++it)
            std::cout << *it << std::endl;
    }
};

int main()
{
    std::vector<double> vD;
    vD.push_back(2.4);
    vD.push_back(2.1);
    vD.push_back(2.2);
    vD.push_back(2.3);

    std::vector<std::string> vS;
    vS.push_back("這是");
    vS.push_back("這是..");
    vS.push_back("這是...");
    vS.push_back("這是....");
    vS.push_back("...");


    Display A;
    A.Show(vD);

    Display B;
    B.Show(vS);
}
程式執行結果
2.4
2.1
2.2
2.3
這是
這是..
這是...
這是....
...

最後的最後一件事提醒,function template的定義(不是宣告唷,是定義)請寫在.h檔[3]或者使用inline

參考資料:
[1] c++ - std::vector as a template function argument - Stack Overflow
[2] c++ - Question about vector iterator in template functions - Stack Overflow
[3] fatal error LNK1120: 2 unresolved externals

visual studio之好用的大綱(摺code)

沒有留言:
visual studio 2005後,vs檢視code有了一種叫「大綱」的方式,也就是將code縮起來。
但是,往往縮起來就只有

...  ←這樣

完全看不出來這是什麼碗糕。

不過,其實有一 個方式,可以做到如下圖,而且做法也在圖中了。^^

也就是在目標程式碼的上下加上
#pragma region 摺起來的灰色字
#pragma endregion 摺起來的綠色字

就這樣,可以整理一下vs生成各種程式碼囉!^^

抱怨VC6//這次是Visual Assist X

沒有留言:
出現了顏色失效好幾天。
圖中的GatParaOfUi()是function,和CheckItem()一樣。
但是,卻沒有跟著CheckItem()變色

試了很多次,也上網了Google「visual assist x 失效 vs2005」
找到了一個不錯的評比文章,和一個山寨的奇摩知識+的問答

但是,這些都不是有效的解。

最後試了最後一個方法


結果,竟然給它好了!

真是想不到,這個外掛程式,判斷語法時,會受字元編碼的影響!@@a

PathFileExists()的用法

沒有留言:
BOOL PathFileExists(LPCTSTR pszPath);
檢查該目錄或檔案是否存在

要加.h檔

#include <shlwapi .h>


出現問題

error LNK2001: unresolved external symbol __imp__PathFileExistsA@4

解法:

除了使用設定專案[1]的方式解決,還可以在程式碼中加入這一行[2]
#pragma comment(lib,"Shlwapi.lib")

參考資料:
[1] PathFileExists用法--使用#include <shlwapi.h>
[2] 高手救命啊!!!Release时出现错误unresolved external!!!!!!

抱怨VC6//Resource View不見了?!

沒有留言:

Resource View是在VC6的Work space中的一個小分頁,它不可以由右鍵讓它消失或出現,但是,有一天,它不見了!

那怎麼叫出來呢?
沒有resource,我怎麼編輯我的Dialog、Toolbar、Icon、Menu和Version??
雖然有其它的tool可以使用,但是在這我們還是由VC6的一般用法的角度下手吧!

進入正題:

 resource view內容所記錄的,其實是一個叫.rc的檔案內容。
而我們要做的就是把它加到project裡!

抱怨VC6//dialog跳不出來,無法顯示

沒有留言:
建立一個MFC的dialog專案之後,發現執行時,什麼都跑不出來!
那先檢查你是否有增加這些控制項
(滑桿控制項)Slider Control (樹狀目錄控制項)Tree Control (日期時間選擇器)Date Time Picker
(微調控制項)Spin Control (索引標籤控制項)Tab Control (月曆)Month Calendar
(進度控制項)Progress Control (動畫控制項)Animation Control (IP 位址控制項)IP Address Control
(熱鍵)Hot Key (Rich Edit 控制項)Rich Edit Control (展開的下拉式方塊)Extended Combo Box
(清單控制項)List Control (Rich Edit 2.0 控制項)Rich Edit 2.0 Control (自訂控制項)Custom Control

抱怨VC6//File: afx.ini Line: 122 的bug

沒有留言:
這個MFC的問題,我在網路上也是找了很久,沒有解,一直到無意間解開了!再重現。以下是以我自己的case做範例重現。


我的main project使用SDI,利用Menu打開各種的Dialog做操作,各個Dialog我都做一個sub project檔來個別開發、測試,最後在main project用#include的方式把code加入,再把dialog的interface給拉到main project,這樣就可以使用。

但是,這樣卻引發了一個隱藏的問題。

抱怨VC6//加了RichEdit,Dialog打不開

沒有留言:

想說,來練習一下CString的find()。

從MS VC6,開一個MFC的Dialog Project。
用Static Text似乎不可以多行顯下,所以就新增一個Rich Edit來看看。
結果程式改成把字串輸出到Rich Edit就打不了?!

做有支援新規格的icon

沒有留言:
誰說工程師一定沒有美感?誰說工程師就是做出醜醜的東西?誰說工程師都自以為很有美感,卻做出醜醜的介面?而且,軟體工程師包山包海包到介面設計時,就要自己做icon。

我就是想要做好看的icon,有專屬的工具。

CP VC6//虛擬函數+動態連結的另類實作

沒有留言:
原本實作了出了問題,後來朋友用g++過了,程式碼也給我了。
看一看,這做法,我印象中做過呀!??
貼到VC6,結果ERROR C2555

心想:這就是傳說中的「微軟不符合標準C++嗎?」
Google了一下,微軟自己還在文件說明中指出,這是產品的問題,更好笑的是,文件的Title寫:「修正: C2555 共的傳回型別具有虛擬函式」。

跟本沒有修正,只說「.Net就修正了」
(意思是你愛用VC6是你家的事,不換.Net活該?= =)

CP VC6//字型調整全攻略

3 則留言:
最近下載了Sublime text 2來玩,說真的,像我這樣常用一大坨IDE在寫程式的開發者,拿高內聚低藕合的程式,只用在文字編輯,真的只是用開心的,不會拿來做平常的編輯器。
畢竟,我用邪惡的M$的VC6,不會Sublime text 2打code,再貼回去。(真的很可惜)

但是,因為它的字型和編排真的太迷人了,所以想要跟他一樣(雖然不知道他是用什麼字的,所以最後沒有和他一樣)就在Google找「vc6 自訂editor

CP VC6//專案檔還會壞掉

沒有留言:
看見Visual C++ 6.0 開啟檔案或加入專案時就出現錯誤![1]之後,還一度懷疑是不是這個問題。

結果一試就好了。
但是Visual C++卻變醜了。

後記,如果在windows7下,這麼做沒有用的話,就看看為win7而寫的文章[2]

另一篇開啟並加入對專案間的 Visual c + + 的功能,來取代 FileTool.exe[3],看了卻是想吐血
M$知道問題,卻....不出更新程式是怎樣(翻桌)



整理上面的文章,簡單的說就是
  1. 下載FileTool.exe[3]並解壓縮
  2. 編譯release之後,放到某一個路徑
    (建議C:\Program Files\Microsoft Visual Studio\Common\MSDev98\AddIns)
  3. 用「管理員權限開啟」cmd,並且輸入(存放路徑是上一步決定的)
    regsvr32 "存放路徑\FileTool.dll"
  4. 在VC6中,Tool->Customize->Add-Ins and Macro Files->Browse
  5. 選FileTool.dll檔

CP VC6//dlgdata.cpp line 43 之「不要相信tool」的鐵則

沒有留言:

這是一個不知道,該怎麼命名的issue,可以叫「IID 分配錯誤 MFC」,不過在此姑且稱「dlgdata.cpp line 43」(Google建議)