Ошибка CString, CString: не является членом ATL :: CStringT <BaseType, StringTraits> ' - PullRequest
1 голос
/ 30 декабря 2010

Я пытаюсь сделать это:

#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'

Thisэто dll, не основанная на MFC, но в соответствии с документами вы должны иметь возможность использовать функциональность CString с включенным #include atlstr.h, как мне заставить его работать?

Спасибо

Ответы [ 2 ]

1 голос
/ 30 декабря 2010

Это не так, как конструкторы вызываются в C ++.

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

Обратите внимание, что GetModuleFilename ожидает указатель на массив символов (который он заполняет), а не указатель на один символ. Поэтому ваш код обречен на сбой во время выполнения.

0 голосов
/ 31 декабря 2010

В этом фрагменте кода есть несколько проблем:

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 должен быть там задействован, но это не кажется необходимымсовсем.Если вы хотите заполнить CString содержимым символьного массива, вы можете просто передать этот массив конструктору, и он позаботится обо всем.Итак, что-то вроде CString FilenameStr(Filename);

...