簡體   English   中英

CString錯誤,“ CString”:不是“ ATL :: CStringT”的成員 <BaseType, StringTraits> &#39;

[英]CString error, 'CString': is not a member of 'ATL::CStringT<BaseType, StringTraits>'

我正在嘗試這樣做:

#include <atlstr.h>

CHAR Filename; // [sp+26Ch] [bp-110h]@1
char v31; // [sp+36Ch] [bp-10h]@1
int v32; // [sp+378h] [bp-4h]@1

 GetModuleFileNameA(0, &Filename, 0x100u);
 CString::CString(&v31, &Filename);

但是我遇到了編譯器錯誤C2039:'CString':不是'ATL :: CStringT'的成員

這是一個不基於MFC的dll,但是根據文檔,您應該能夠在包含#include atlstr.h的情況下使用CString功能,我該如何使其工作?

謝謝

這不是在C ++中調用構造函數的方式。

CString s = CString(&v21,&File);

請注意, GetModuleFilename需要一個指向字符數組(它填充)的指針,而不是指向單個字符的指針。 因此,您的代碼注定在運行時崩潰。

此代碼段中有幾個問題:

1) CHAR Filename; 聲明僅一個字符的變量。 但是, GetModuleFileNameA希望獲得一個指向字符數組的指針。 當您傳遞參數&Filename0x100u您會認為&Filename指向一個內存數組,最多可容納256個字符。 但是,正如您所摘錄的那樣,它只是一個字符。 因此,您將有嚴重的緩沖區溢出。

Filename最有可能應聲明為CHAR Filename[0x100]; 在這種情況下。 這也意味着您在將文件名傳遞給該函數時不需要使用文件名的地址。 因此該調用將被寫為GetModuleFileNameA(0, Filename, 0x100u);

2)在為構造函數編寫代碼時,定義是通過編寫類似於CString::CString (使用您的類的名稱),然后填寫該函數。 但是,在使用構造函數時,根本不使用該語法。 您不調用CString::CString()創建CString對象。

您將必須為CString對象選擇一個名稱,例如“ FilenameStr”。 因此,在您編寫代碼的上下文中,您將編寫類似於CString FilenameStr(Filename);

3)正如最后一點所暗示的那樣,您試圖傳遞給構造函數的參數是錯誤的。 &v31&Filename都將通過指針指向原始代碼中的字符。 但是,據我所知,CString沒有任何帶有兩個字符指針的構造函數。

我什至不知道v31應該如何參與其中,但似乎根本沒有必要。 如果要用字符數組的內容填充CString,則可以將該數組傳遞給構造函數,它將處理所有事情。 因此,類似於CString FilenameStr(Filename);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM