API등을 사용하다보면 구조체가 필요할 때가 있습니다.
구조체는 상현님께서 만드신 구조체함수를 사용하면 문제될 것이 없습니다.
구조체 다루는 함수 (v3)
(http://cugz.sjworks.net/bbs/zboard.php?id=pds_sc&no=776 )
그런데 다음과 같은 녀석은 구조체에 문자형을 집어넣어야 하는 경우가 있습니다.
OPENFILENAME Structure
typedef struct tagOFN {
DWORD lStructSize;
HWND hwndOwner;
HINSTANCE hInstance;
LPCTSTR lpstrFilter;
LPTSTR lpstrCustomFilter;
DWORD nMaxCustFilter;
DWORD nFilterIndex;
LPTSTR lpstrFile;
DWORD nMaxFile;
LPTSTR lpstrFileTitle;
DWORD nMaxFileTitle;
LPCTSTR lpstrInitialDir;
LPCTSTR lpstrTitle;
DWORD Flags;
WORD nFileOffset;
WORD nFileExtension;
LPCTSTR lpstrDefExt;
LPARAM lCustData;
LPOFNHOOKPROC lpfnHook;
LPCTSTR lpTemplateName;
#if (_WIN32_WINNT >= 0x0500)
void *pvReserved;
DWORD dwReserved;
DWORD FlagsEx;
#endif
} OPENFILENAME, *LPOPENFILENAME;
위에 노란색으로 된 녀석들이 문자형을 요구하는 것들입니다.
그렇다고 창조에서 문자형을 요구하는 녀석에 진짜 문자 데이터를 넣을 수는 없습니다. 문자 데이터의 주소를 넣어야 합니다.
창조만으로 변수의 주소는 알아낼 수가 없습니다.
다소 꼼수라고는 생각하지만, 지금으로써는 이 방법밖에 없는것 같습니다.
API를 사용해서 문자의 주소를 얻어 사용하는 방법입니다.
ㅎ사용자함수
연결파일: Kernel32
실수함수: lstrcat(문자: lpString1, lpString2);
사실, lstrcat 함수는 두 문자를 합쳐주는 역할을 합니다. 창조의 '문자붙여' 함수와 동일한 기능을 합니다.
(http://msdn.microsoft.com/en-us/library/ms647487(VS.85).aspx )
그런데 이 함수의 반환값은 합쳐진 문자의 "주소" 를 반환합니다.
따라서 창조에서 어떤 문자열의 주소를 얻고자 한다면 다음과 같이 하시면 됩니다.
문자: 문1;
실수: 문1주소;
문1 := "나는 문자에요. 제 주소를 얻어주세요.";
문1주소 := 사용자함수0.lstrcat(문1, 수문(0));
문1과 수문(0)을 합쳐서 주소를 반환합니다.
수문(0)은 Null 문자입니다.(따라서 문자를 합치는 기능은 무의미하고 주소만 얻어내려는 용도입니다.)
이 방법은 아래의 자료들에 사용되었습니다.
API로 파일관리창 띄우기
http://cugz.sjworks.net/bbs/zboard.php?id=pds_sc&no=778
|