[ 문제의 코드 ]
HWND WINAPI function(...){ HWND hWnd; hWnd = CreateWindowExW( 0, L"SysLink",L"<A HREF=\"#\">Link Click</A>",WS_VISIBLE|WS_CHILD,X,Y,nWidth,nHeight,this->hWnd,(HMENU)nIdentNum,this->hInstance,NULL); ... return hWnd; }
|
SysLink 윈도우를 만드는데 . . . 아무리 만들어도 . . . 안된다 !
GetLastError() 로 확인해보니 ERROR_CANNOT_FIND_WND_CLASS 메시지를 뿜어됐던것이 사건의 시작.
3시간 가량을 헤매고 헤매어 검색해봤지만 . . .
아예 답변이 없거나 !
RegisterClass 가 선언되지 않았다 ! 라는 답변 뿐
윈도우 시스템 상 전역으로 처리된 SysLink 가 클래스로 정의되어있지 않을리 없다 -_- . . .
혹시나 싶어 InitCommonControls 이 선언되지 않아서 그런걸까 . . . 해서 !
해봤지만 역시 안된다 . . .
스팀찬다.
기본적으로 시스링크 같은 경우엔 확장형 컨트롤이라 가정하고 . . .
일반 컨트롤과 다르게 따로 뭔가 처리를 해줘야 한다면 . . .
에 도착한 결론은 . .
#pragma comment(linker, "/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")
|
.
이 녀석 -_- ; 선언해주어야 하옵니다.
평소 배포용으로 만들 프로그램을 프로그래밍 할 땐, 윈도우 스킨이 맛깔나지 않아서 항상 선언해줘서
문제가 없었는데, 이번 프로그램 만들면서
" 어차피 내가 쓸거니까 상관없잖아 ~ " 하면서 발코딩하면서 생긴 문제.
MSDN을 읽어보니
"The SysLink control is defined in the ComCtl32.dll version 6, and it requires a manifest or directive that specifies that version 6 of the DLL should be used if it is available." |
출처 : http://msdn.microsoft.com/en-us/library/windows/desktop/bb760706(v=vs.85).aspx
라 적혀있고 비쥬얼 스타일 키는 방식에 대해선
http://msdn.microsoft.com/en-us/library/windows/desktop/bb773175(v=vs.85).aspx
위와 같이 나와 있는데 결론은 메니페스트만 넣어주면 되는 결론이 나왔다. -_- ; ;
SysLink 외에 RichEdit 와 같은 확장형 컨트롤을 위하여 반드시 위 선언을 넣어주면 너무나 도움될거 같다.
광고, 악성코드 썰 좀 풀어보자. (4) | 2013.05.04 |
---|---|
[임시] 티스토리 스팸 덧글/방명록 차단. (8) | 2013.04.27 |
심심해서 풀어본 키젠미 (4) | 2013.04.06 |
심심해서 적어보는 C언어 간략한(?) 총정리. (0) | 2013.03.21 |
FSCH BETA 1.0v User Manual (2) | 2013.03.06 |
간만에 키젠미 해보고 싶어서 했다가 풀소스 작성해버림.
[ 키젠미 파일 ]
관련 링크 : http://tuts4you.com/download.php?view.2127
[ 소스 ]
순수 어셈으로 작성된 듯한 코드들과
거기다 패킹되어있지도 않고, 안티디버깅도 어려운거 쓰지 않았고 . . .
난이도가 3/10 인데, 딱 이정도인듯 싶다.
추가로, 코드 후킹만 좀 하면 키젠따윈 순식간에 만들법하다.
소스는 C언어로 작성함.
내가 작성해두고 외계어 적어둔거 같네.
해설 적고 싶은데 너무 양이 많아서 때려침.
(어차피 볼사람도 없을거고 . . .)
혹시나 소스보고 궁금한거 있으면 덧글로 ㄱㄱ
[임시] 티스토리 스팸 덧글/방명록 차단. (8) | 2013.04.27 |
---|---|
빡침의 하루 ( ERROR_CANNOT_FIND_WND_CLASS ) (4) | 2013.04.23 |
심심해서 적어보는 C언어 간략한(?) 총정리. (0) | 2013.03.21 |
FSCH BETA 1.0v User Manual (2) | 2013.03.06 |
심심하니 fread, fwrite, fseek, ftell 구현. (Windows) (2) | 2012.10.21 |
※ 어플로케일이 설치되어 계신 분들은 아래 ApplocAutoShortcut.exe 만 받아주시면 됩니다.
이놈의 기능은 . . .
이 창을 무시해줍니다.
프로그램을 더블클릭하면 위와 같이 뜨는데, '예(Y)' 를 클릭해서
이거뜨면 성공한겁니다. 이 상태에서 원하는 게임을 '오른쪽 마우스 클릭' 을 해서
Run with Applocale (&A) 버튼을 눌러주면 성공 !
이렇게 하시면 됩니다.
한국 EMS 다중 배송 추적/조회 (0) | 2014.08.01 |
---|---|
인터넷 임시 파일 자동 다운로드 방지 프로그램 (0) | 2014.07.20 |
Fore's Secret ClipboardHooker SDK Beta 1.02v (0) | 2013.03.29 |
IE7 이상 추가 검색 공급자 직접만들기 (16) | 2013.02.18 |
Switch Run (2) | 2012.09.14 |
[개발자용 문서입니다.]
[ 표준 함수 ]
void *FSHAlloc(unsigned int ui_size);
# 힙 메모리를 할당합니다.
- _In_ unsigned int ui_size : 할당할 메모리 크기.
void FSHFree(void *lpMem);
# 힙 메모리를 해제합니다
- _In_ void * lpMem : 해제할 메모리 주소를 넣습니다.
void SendEditBoxMessage(HWND hMainWnd,LPWSTR lpString);
# 텍스트 창에 문자열을 보냅니다.
- _In_ HWND hMainWnd : 메인 윈도우 핸들.
- _In_ LPWSTR lpString : 보낼 유니코드 문자열.
void ForceHookerDataSave(HWND hMainWnd);
# 데이터를 강제로 저장합니다.
- _In_ HWND hMainWnd : 메인 윈도우 핸들.
[ 콜백 함수 ]
FTYPE_EXPORT(void) FSH_MainWindowInit
(HWND hMainWnd,HWND hTextWnd);
# 메인 윈도우가 시작되기전에 발동합니다.
- HWND hMainWnd : 메인 윈도우 핸들.
- HWND hTextWnd : 텍스트 윈도우 핸들.
FTYPE_EXPORT(void) FSH_MainWindowCommand
(HWND hWnd,WPARAM wParam,LPARAM lParam,BOOL bPluginMenu);
# 플러그인 메뉴 혹은 번역기 메뉴가 클릭되면 발동합니다.
- HWND hMainWnd : 메인 윈도우 핸들.
- WPARAM wParam, LPARAM lParam : WindowProc 함수와 동일.
- BOOL bPluginMenu :
TRUE 시 유저가 플러그인 메뉴를 클릭함.
FALSE 시 유저가 번역기 메뉴를 클릭함.
FTYPE_EXPORT(void) FSH_MainWindowDestroy
(HWND hMainWnd,HWND hTextWnd);
# 메인 윈도우가 종료되기전에 발동합니다.
- HWND hMainWnd : 메인 윈도우 핸들.
- HWND hTextWnd : 텍스트 윈도우 핸들.
FTYPE_EXPORT(void) FSH_PrevTranslate
(LPWSTR lpJapaneseString,LPWSTR *lpNewJapaneseString);
# 번역기가 돌아가기전에 발동합니다.
- LPWSTR lpJapaneseString: 클립보드에 받아온 일본어 문자열.
- LPWSTR *lpNewJapaneseString : 수정한 새로운 문자열.
※ 반드시 FSHAlloc 함수를 이용해 할당하여 넘겨야합니다.
example )
FSH_PrevTranslate(lpJapaneseString,lpNewJapaneseString){
*lpNewJapaneseString = (LPWSTR)FSHAlloc(12);
wcscpy(*lpNewJapaneseString,L"안녕하세요");
}
FTYPE_EXPORT(void) FSH_Translate
(LPWSTR lpJapaneseString,LPWSTR *lpKoreanString);
# PrevTranslate 끝난 후 발동합니다.
- LPWSTR lpJapaneseString: 일본어 문자열.
- LPWSTR *lpKoreanString: 번역한 한국어 문자열.
※ 반드시 FSHAlloc 함수를 이용해 할당하여 넘겨야합니다.
※ 예제는 FSH_PrevTranslate 함수 참고.
FTYPE_EXPORT(void) FSH_AfterTranslate
(LPWSTR lpKorString,LPWSTR *lpNewKorString);
# Translate 끝난 후 발동합니다.
- LPWSTR lpKorString: 번역된 한국어 문자열.
- LPWSTR *lpNewKorString: 새로운 한국어 문자열.
※ 반드시 FSHAlloc 함수를 이용해 할당하여 넘겨야합니다.
※ 예제는 FSH_PrevTranslate 함수 참고.
FTYPE_EXPORT(void) FSH_OtherProgramRunInit
(HANDLE hProcess,DWORD dwProcessId,DWORD dwRunType);
# 다른 프로그램이 시작하기전에 발동합니다.
- HANDLE hProcess: 다른 프로그램에 설정된 로더 프로그램 프로세스 핸들.
※ Default 설정시, 로더가 아닌 다른 프로그램으로 프로세스 핸들이 넘어감.
- DWORD dwProcessId : 다른 프로그램에 설정된 로더 프로그램 프로세스 아이디.
※ Default 설정시, 로더가 아닌 다른 프로그램으로 프로세스 아이디로 넘어감.
- DWORD dwRunType : 실행된 프로그램 타입(enum _OTHER_PROG_RUN_TYPE 참고)
FTYPE_EXPORT(void) FSH_TextHookerProgramRunInit
(HANDLE hProcess,DWORD dwProcessId,DWORD dwRunType);
# 텍스트 후커 프로그램이 시작하기전에 발동합니다.
- HANDLE hProcess: 텍스트 후커 프로그램 프로세스 핸들.
- DWORD dwProcessId : 텍스트 후커 프로그램 프로세스 아이디.
- DWORD dwRunType : 실행된 프로그램 타입(enum TEXT_HOOKER_TYPE 참고)
FTYPE_EXPORT(void) FSH_PluginInfo
(LPWSTR *lpPluginName);
# 플러그인 메뉴 삽입, 데이터 저장시 발동합니다.
- LPWSTR lpPluginName: 플러그인 이름을 넣습니다.
※ 반드시 FSHAlloc 함수를 이용해 할당하여 넘겨야합니다.
※ 예제는 FSH_PrevTranslate 함수 참고.
인터넷 임시 파일 자동 다운로드 방지 프로그램 (0) | 2014.07.20 |
---|---|
Applocale Autoclick Loader (4) | 2013.04.01 |
IE7 이상 추가 검색 공급자 직접만들기 (16) | 2013.02.18 |
Switch Run (2) | 2012.09.14 |
Fore database list creater beta 1.0v (2) | 2012.09.06 |
필수적이라 생각하는 부분만 간략하게 요약해서 적음.
※ main 함수. |
기본 형태> http://msdn.microsoft.com/en-us/library/6wd819wh.aspx
#include <stdio.h>
int main(int argc, char *argv[], char *envp[]){
return 0;
}
원래 기본 형태는 이런데, 아래와 같이 간추려서 쓰는 경우가 대부분이다.
Visual Studio 사용자 >
#include <stdio.h>
void main(){
}
※ 6.0 이하의 사용자는 main() 만 선언해도 인식된다.
Dev C++ 사용자 >
#include <stdio.h>
int main(){
return 0;
}
Tip > 아오 . . . 컴파일러 하고 실행하면 그냥 꺼져요.
해결법 01. >
#include <stdio.h>
#include <conio.h>
void main(){
코드 작성 후
getch();
}
해결법 02. >
#include <stdio.h>
#include <stdlib.h>
void main(){
코드 작성 후
system("pause");
}
컴파일러 옵션으로 설정하면 위와 같이 코드 작성할 필요 없는데
컴파일러마다 달라서 패스함.
※ 타입 |
int - 정수형 4bytes
char - 문자형 1bytes
float - 실수형 4bytes
그 외에 조금 이야기하면 long(4bytes), short(2bytes), double(8~16 os에마다 다름) 등이 있는데
컴퓨터 전공이 아닌 이상 거의 배우지도 않는다 생각함.
참고로, 영문, 숫자 글자같은 경우엔 1bytes(char)로 충분하지만, 한글 같은 경우엔 2bytes을 소요하므로
short 으로 선언하거나 char을 배열로 2개이상 선언해야한다.
※ 함수 |
일반 형태 >
[리턴형태] [함수 이름](인자...){
소스...
return (리턴형태의 값);
}
예제 >
int add(int a,int b){
return a+b;
}
printf("%d",add(1,2));
결과 : 3
번외 01. > printf 의 예약된 문자
%d : 음수 표현가능한 정사
%f : 실수
%lf : 32bit 실수
%x : 16 진수
%o : 8 진수
%s : 문자열
%c : 문자
이스케이프 문자 >
'\n' : 개행
'\r' : 리턴행
'\t' : 탭
※ 배열 |
저놈의 타입놈들을 따로 선언하는게 아닌 뭉텅이로 선언시킴.
int i[10]; // int 형 변수가 10개가 뭉쳐있음.
표현 방식 > printf("%d",i[0]); // i 배열의 첫번째 숫자를 출력함.
번외 02. > scanf 함수 간단한 사용법
int a;
char b[10];
scanf("%d",&a); // a 변수에 사용자가 입력하는 정수형 수를 받아옴.
scanf("%s",b); // b 배열에 사용자가 입력하는 문자열을 받아옴.
※ 연산자 |
[ 단순 ] 사용되는 사례 : 그냥 이건 가지가지 나옴.
◎ + : 더한다.
◎ - : 뺀다.
◎ / : 나눈다.
◎ * : 곱한다
◎ % : 나머지 값.
나머지 값만 예>
int a = 100%2;
printf("%d",a);
결과 : 0
100을 2로 나누면 나머지가 0이므로 0
[ 증감 ] 사용되는 사례 : 이거도 가지가지 나옴.
++ : 1씩 증가시킴.(포인터의 경우 해당 타입의 바이트만큼 주소값을 옮김)
-- : 1씩 감소시킴.(포인터의 경우 해당 타입의 바이트만큼 주소값을 옮김)
예 01>
int a = 1;
printf("%d",a++);
printf("%d",a);
결과 > 1, 2
예 02>
int a = 1;
printf("%d",--a);
printf("%d",a);
결과 > 0, 0
[비트] 사용되는 사례 : 다중 선택이 필요한 경우, 압축, 암호화 기술 등에 사용.
◎ [값]<<[옮길 크기] : 해당 값의 비트를 왼쪽으로 옮길 크기만큼 옮긴다.
◎ [값]>>[옮길 크기] : 해당 값의 비트를 오른쪽으로 옮길 크기만큼 옮긴다.
예 >
1<<2 : 결과 : 5
1>>2 : 결과 : 0
◎ ~[A값] : A값의 비트를 1을 0으로 0을 1로 바꾼다.
예 >
int a = 5; // (100)
a = ~a; // (100) = (011)
printf("%d",a);
결과 : 3 (011)
5(100) 를 1을 0으로 0을 1로 바꾸면 3(011)
◎ [A값]^[B값] : A값과 B값을 비교해서 서로 비트가 다르면 1 같으면 0으로 바뀐다.
예 >
int a = 1;//(01)
int b = 2;//(10)
printf("%d",a^b);
결과 > 3(11)
1(01) 와 2(10) 비교해서 첫번째 비트를 비교해서
0 과 1이니까 1로 두번째비트를 비교해서
1과 0이니 1이 되서 3(11)이 된다.
01
10
11
이런 느낌.
◎ [A값]|[B값] : A값과 B값을 비교해서 둘다 비트가 0이 아니면 무조건 1이다.
int a = 5;//(100)
int b = 1;//(001)
printf("%d",a|b);
결과 > 6(101)
◎ [A값]&[B값] : A값과 B값을 비교해서 둘다 비트가 1이 아니면 무조건 0이다.
int a = 7; // (110)
int b = 3; // (011)
printf("%d",a&b);
결과 > 2(010)
[논리]
[A값] == [B값] : A값과 B값이 같으면 참, 아니면 거짓.
[A값] != [B값] : A값과 B값이 같지 않으면 참, 아니면 거짓.
[A값] <= [B값] : A값이 B값보다 작거나 같으면 참, 아니면 거짓.
[A값] >= [B값] : A값이 B값보다 크거나 같으면 참, 아니면 거짓.
[A값] < [B값] : A값이 B값보다 작으면 참, 아니면 거짓.
[A값] > [B값] : A값이 B값보다 크면 참, 아니면 거짓.
![A값] : A값이 참이면 거짓, A값이 거짓이면 참
[간략형]
◎ +=, -=, /=, *=, >>=, <<=, &=, ~=, ^=, |=
하나만 예>
int a = 0;
a += 1; // a = a + 1 와 동일함.
printf("%d",a);
※ 예약어(명령어) - 조건문 |
# if 조건문
if(조건문)
else if (조건문)
else
예제 01> if문 일반적인 사용
int a = 1, b = 2;
if ( a == 1 )
printf("a = 1\n");
if ( b == 1 )
printf("b = 1\n");
else if ( b == 2 )
printf("b = 2\n");
if ( a == 2 )
printf("a = 2\n");
else
printf("none\n");
결과 >
a = 1
b = 2
none
예제 02> 재귀 함수를 이용한 if문 사용
int factorial(int a,bool bInit){
static int nRetnNum = 0;
if ( bInit == true )
nRetnNum = 0;
if ( a != 0 )
factorial(a-1,false);
return RetnNum;
}
printf("%d",factorial(10,true));
결과 : 55
static 로 선언된 변수는 프로그램이 끝나기 전까지 없어지지 않는다.
# switch 조건문
switch(정수형 혹은 정수를 표현 가능한 변수){
case (조건 정수 혹은 정수를 표현 가능한 기호):
break;
default:
break;
}
예제 >
int a = 'a';
switch(a){
case 1:
break;
case 'a':
case 'b':
printf("a");
break;
default: // 위 조건에 하나도 맞지 않는 경우 이쪽에 들어옴.
break;
}
결과 : a
# ?: 조건문
(조건문)?참일경우:거짓인경우;
예>
int a = 1;
int b;
b = (a == 1)?2:3;
printf("%d",b);
결과 : 2
#goto 문
int main(){
goto MY_GOTO;
printf("a");
MY_GOTO:
printf("b");
return 0;
}
결과 : b
※ 예약어(명령어) - 반복문 |
# for 반복문
기본문 : for(초기화문;조건문;연산식);
예제 01>
int i;
for(i=0;i<5;i++)
printf("%d ",i);
결과 01> 0 1 2 3 4
Tip : for 다음으로 넘어가는 함수 혹은 연산식이 1줄밖에 없을 경우 { } 생략 가능.
예제 02> if 문을 활용한 continue, break 사용법
int i;
for(i=0;i<5;i++){
if ( i == 1 )
continue;
if ( i == 3 )
break;
printf("%d ",i);
}
결과 02> 0 2
continue 의 경우엔 반복문 + 조건문 상태에서만 가능하며, 해당 조건에 맞을시
반복문 continue 밑으로 진행되는 코드가 전부 무시되고 다음 반복문으로 넘어간다.
break 의 경우엔 반복문 + if 문에 맞을 경우, 반복문에서 빠져 나오게 되고,
switch 의 경우엔 switch 문에서만 나오게 된다.
# while 반복문
기본문 : while(조건문);
예제 >
int i = 5;
while(i)
printf("%d ",i--);
결과 > 5 4 3 2 1
Tip : 0은 모든 조건의 거짓이 된다. ( 반대로 0 초과하는 모든 수는 참 )
따라서, while 루프 돌 때 0이면 자동적으로 탈출하게 된다.
# do..while 반복문
기본문 : do{~}while(조건문);
예제 >
int i = 5;
do
printf("%d ",i--);
while(i);
결과 > 5 4 3 2 1
※ 포인터 |
int i;
int *p = &i;
printf("%d %d %d",&p,p,*p);
결과 : &p = p라는 포인터 변수의 주소, p = i라는 변수 주소, *p = i의 값.
※ 포인터도 변수임을 명심.
대표적인 Swap을 예로함.
예 01. ( 포인터 변수를 이용한 swap )
void swap(int *a,int *b);
int i = 2;
int j = 1;
swap(&i,&j);
printf("%d %d",i,j);
void swap(int *a,int *b){
int t = *a; // a 변수에 b 변수로 저장하면 a 값이 사라지므로 임시로 a의 값을 저장해둠.
*a = *b; // a 변수에 b 변수 값으로 저장함.
*b = t; // b 변수에 임시로 저장한 a값을 저장함.
}
예 02. ( 참조 변수를 이용한 swap )
void swap(int &a,int &b);
int i = 2;
int j = 1;
swap(i,j);
printf("%d %d",i,j);
void swap(int &a,int &b){
int t = a;
a = b;
b = t;
}
그 외에 포인터의 계산 등이 있는데, 아마 컴퓨터 관련 전공자 아니면 배우지 않으리라 생각함.
Tip > 안쓰려다 써보는 간략 포인터 계산.
int i[10];
int *p1 = &i[0], *p2 = &i[3];
printf("%d",p2-p1);
결과 : 3
당연히 3 이 나오겠냐 생각할지도 모르겠지만, 조금 생각이 있는 사람이면 12 를 생각했을 것이다.
(int 변수가 4bytes 를 가지고 있기 때문에)
하지만, 컴파일러가 컴파일할 때 자동적으로 4로 나눠버려서 기계어로 넣어버리기에 3이 맞다.
※구조체 |
예 >
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct _STUD{
char cName[20];
int nNum;
_STUD *NextStud;
};
// 위와 같이 변수 뿐만 아니라 함수도 집어 넣을 수 있다.
// 예를 들어
// struct _STUD{
// int a;
// int b;
// void add(){
// return a+b;
// }
// };
// _STUD i;
// i.a = 1;
// i.b = 2;
// printf("%d",i.add());
// 위와 같은 식으로도 표현 가능하다.
int main(void){
_STUD Stud01;
_STUD *Stud02;
// 동적 메모리 할당. malloc(할당 메모리 크기)
// malloc 함수의 리턴형은 void의 포인터형(void *)이므로 캐스팅이 필요함.
Stud02 = (_STUD *)malloc(sizeof(_STUD));
// 문자열 복사 함수. strcpy(dest,source)
// dest : 저장할 메모리 주소
// source : 복사해올 메모리 주소
// 일반적으로 선언된 구조체내의 변수를 불러올땐 "." 을 이용하고
// 포인터로 선언된 구조체는 -> 으로 표현한다.
strcpy(Stud01.cName,"FORE01");
strcpy(Stud02->cName,"FORE02");
// 위 strcpy(Stud02->cName,"FORE02"); 의 경우에
// strcpy(Stud02[0].cName,"FORE02"); 으로도 표현이 가능하다.
Stud01.nNum = 1;
Stud02->nNum = 2;
printf("01 Name : %s\n",Stud01.cName);
printf("01 Num : %d\n",Stud01.nNum);
printf("02 Name : %s\n",Stud02->cName);
printf("02 Num : %d\n",Stud02->nNum);
Stud01.NextStud = Stud02;
// 링크드 리스트를 위한 예제
// Stud01.NextStud 에 Stud02 의 주소를 저장시켜 Stud01 을 통해 Stud02 를 불러온다.
printf("Addtional Name : %s\n",Stud01.NextStud->cName);
printf("Addtional Num : %d\n",Stud01.NextStud->nNum);
// 메모리를 해제한다.
free(Stud02);
system("pause");
return 0;
}
결과 >
01 Name : FORE01
01 Num : 1
02 Name : FORE02
02 Num : 2
Additional Name : FORE02
Addtional Num : 2
※공용체 |
예>
union _MY_SHARE{
int a;
int b;
int c;
};
_MY_SHARE i;
i.a = 1;
printf("%d %d %d",i.a,i.b,i.c);
결과 : 1 1 1
※ 전처리기, 매크로, enum |
◎ #define [이름] [값,식,타입,함수,매크로값 등등..]
예 >
#define MAX_NUM 10
#define ADD_DEF(a,b) (a+b)
printf("%d",ADD_DEF(MAX_NUM,5));
결과 : 15
◎ #if (조건)
◎ #elif (조건)
◎ #else
◎ #endif
예>
#define _MY_SOURCE
#if _MY_SOURCE
printf("a");
#else
printf("b");
#endif
결과 : a
◎ typedef (변수 타입) (새로운 이름 명명)
예>
typedef int MyInt, *pMyInt;
int main(void){
MyInt a = 1;
pMyInt p = &a;
printf("%d %d %d",&p, p, *p);
}
결과 : &p = p라는 포인터 변수의 주소, p = i라는 변수 주소, *p = i의 값.
◎ enum (이름){ 정의값 }
예>
enum _stud{
ST_FORE01 = 10,
ST_FORE02,
ST_FORE03
};
printf("%d %d %d",ST_FORE01,ST_FORE02,ST_FORE03);
결과 : 10 11 12
아마 이정도면 어느정도 문제 없지 않을까 ?
이거 적는데 솔직히 1시간이면 될 줄 알았는데 2시간 걸림 -_- ; ; ;
( 적으니까 이거도 적어야하고 이거 적고나니까 저거도 적어야겠고 . . . )
여기서 안담은게 좀 있는데, 예를 들어 ##, 비트형 혹은 비트 분할형 변수 선언, const,
'\' 의 사용법(다중 개행, 바이너리 표현 등), printf, scanf 의 상세한 사용법 등이 있는데
어차피 대학에서 배울거면 전공이 아닌 이상 안나올거 같음.
자세한건 관련 서적 찾아보면 될 거 같다.
빡침의 하루 ( ERROR_CANNOT_FIND_WND_CLASS ) (4) | 2013.04.23 |
---|---|
심심해서 풀어본 키젠미 (4) | 2013.04.06 |
FSCH BETA 1.0v User Manual (2) | 2013.03.06 |
심심하니 fread, fwrite, fseek, ftell 구현. (Windows) (2) | 2012.10.21 |
심심하니, 쓰레드에 대해 이야기해보자. (0) | 2012.10.10 |
|
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |