Ошибка CString, CString: не является членом 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"
Это dll, не основанный на MFC, но в соответствии с документами вы должны иметь возможность использовать функциональность CString с include #include atlstr.h, как мне заставить его работать?
Спасибо
2 ответа
Это не то, как конструкторы вызываются в C++.
CString s = CString(&v21,&File);
Обратите внимание, что GetModuleFilename
ожидает указатель на массив символов (который он заполняет), а не указатель на один символ. Поэтому ваш код обречен на сбой во время выполнения.
У вас есть несколько проблем в этом фрагменте кода:
1) CHAR Filename;
объявляет переменную, которая является только одним символом. Тем не мение, GetModuleFileNameA
ожидает, что будет дан указатель на массив символов. Когда вы передаете параметры &Filename
а также 0x100u
Вы бы заставили это думать, что &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
Предполагается, что он там участвует, но это вовсе не обязательно. Если вы хотите заполнить строку CSt содержимым массива символов, вы можете просто передать этот массив конструктору, и он позаботится обо всем. Итак, что-то вроде CString FilenameStr(Filename);