CString错误,'CString':不是'ATL :: CStringT <basetype,stringtraits =“”>'</basetype,>的成员

时间:2010-12-30 19:47:25

标签: c++ visual-studio-2008 cstring

我正在尝试这样做:

#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功能,如何使其工作?

由于

2 个答案:

答案 0 :(得分:1)

这不是如何在C ++中调用构造函数。

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

请注意,GetModuleFilename需要一个指向字符数组(它填充)的指针,而不是指向单个字符的指针。因此,您的代码注定要在运行时崩溃。

答案 1 :(得分:0)

您在此代码段中遇到了几个问题:

1)CHAR Filename;声明一个只有一个字符的变量。但是,GetModuleFileNameA期望获得指向字符数组的指针。当您传递参数&Filename0x100u时,您会认为&Filename指向一个内存数组,最多可容纳256个字符。但是,正如你的剪辑中所写,它只是一个字符。因此,你的缓冲区溢出会很糟糕。

在这种情况下,

Filename最有可能被声明为CHAR Filename[0x100];。这也意味着在将文件传递给该函数时不需要获取Filename的地址。因此,呼叫将被写为GetModuleFileNameA(0, Filename, 0x100u);

2)在为构造函数编写代码时,您可以通过编写与CString::CString类似的东西来定义(使用您的类的名称),然后填写函数。但是,在使用构造函数时,根本不使用该语法。您不能致电CString::CString()来创建CString对象。

您必须为CString对象选择一个名称,例如“FilenameStr”。因此,在您编写代码的上下文中,您将编写类似CString FilenameStr(Filename);

的内容

3)正如在最后一点的结尾所暗示的那样,您尝试传递给构造函数的参数是错误的。 &v31&Filename分别指向原始代码中的字符。但是,据我所知,CString没有任何带有两个字符指针的构造函数。

我甚至不知道v31应该如何参与其中,但似乎根本没有必要。如果你想用字符数组的内容填充CString,那么你可以将该数组传递给构造函数,它将处理所有事情。所以,像CString FilenameStr(Filename);