2010-12-30 2 views
1

나는이 일을하려고 오전 :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 '의 멤버가 아닙니다

이것은 MFC 기반이 아닌 dll이지만 문서에 따라 include #include atlstr.h와 함께 CString 기능을 사용할 수 있어야합니다. 어떻게해야합니까? 작동하게 만들다?

감사합니다.

답변

1

이것은 생성자가 C++에서 호출되는 방식이 아닙니다.

GetModuleFilename (이것은 채우기) 문자의 배열에 대한 포인터를 예상하는

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

참고 단일 문자하지 포인터. 따라서 런타임시 코드가 파손될 수 있습니다. CHAR Filename;는 하나의 문자 변수를 선언

1) :

+1

알렉스, 나는 GetModuleFilename, 왜 내 CString 호출이 오류를 생성합니까 내 질문을 사는 문자 배열을 필요로 이해합니까? – flavour404

+1

올바르게 생성자를 호출하지 않았기 때문에. C++의 생성자는 클래스의 정규 멤버가 아니며 정적이 아니기 때문에'foo :: bar '를 호출하면'bar'가'foo'의 정적 멤버 여야 함을 의미합니다. 가능한 조치를 취하기 위해 제 응답을보십시오. –

+0

미안 알렉스, 조금 강조하고 나는 당신이 말한 것을 놓쳤다. 나는 지금 그것을 얻고 당신에게 감사한다. – flavour404

0

는이 코드에 몇 가지 문제가있다. 그러나 GetModuleFileNameA에는 문자 배열에 대한 포인터가 있어야합니다. &Filename0x100u 매개 변수를 전달할 때 &Filename은 최대 256 자의 공간이있는 메모리 배열을 가리킨다 고 생각하게 만듭니다. 그러나, 귀하의 짤깍 소리에 쓰여진 것처럼, 그것은 단 한 문자입니다. 따라서 나쁜 버퍼 오버플로가 발생합니다.

Filename이 경우에는 CHAR Filename[0x100];으로 표시되어야합니다. 따라서 해당 함수에 전달할 때 Filename의 주소를 가져올 필요가 없습니다. 따라서 호출은 GetModuleFileNameA(0, Filename, 0x100u);

으로 작성됩니다. 2) 생성자에 대한 코드를 작성할 때는 CString::CString (클래스의 이름이 무엇이든간에)과 비슷한 것을 작성한 다음 함수를 작성해야합니다. 그러나 생성자를 사용할 때는 해당 구문을 전혀 사용하지 마십시오. 을 호출하여 CString 개체를 만들지 마십시오.

CString 개체의 이름을 선택해야합니다 (예 : "FilenameStr"). 따라서 코드 컨텍스트에서 다음과 같은 코드를 작성하십시오. CString FilenameStr(Filename);

3) 마지막 포인트의 끝 부분에서 암시 하듯이 생성자에 전달하려는 매개 변수가 잘못되었습니다. &v31&Filename은 원래 코드의 문자를 가리키는 포인터입니다. 그러나, 내가 아는 한, CString에는 두 개의 문자 포인터를 사용하는 생성자가 없습니다.

v31이 (가) 어떻게 관련되어 있는지 알 수는 없지만 전혀 필요하지는 않습니다. 문자 배열의 내용으로 CString을 채우려면 해당 배열을 생성자에 전달하면 모든 것이 처리됩니다. 그래서, 같은 뭔가가 CString FilenameStr(Filename);

관련 문제