В этом фрагменте кода есть несколько проблем:
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);