Shellexecute()

1. 응용프로그램 실행

ShellExcute(NULL, "open", "c:\\test.txt", NULL, NULL, SW_SHWONORMAL);

2. 특정 프로그램으로 원하는 파일 열기

3. 인터넷 익스플로러 사용하기

ShellExcute(NULL, "open", "iexplore", "http://www.tistory.com", NULL, SW_SHWONORMAL);

4. 응용프로그램의 인쇄 기능 사용하기

ShellExcute(NULL, "print", "c:\\test.txt", NULL, NULL, SW_SHWONORMAL);

5. 탐색기 실행

ShellExcute(NULL, "open", "explorer","c:\\test", NULL, SW_SHOW);

'c/c++ > 레퍼런스' 카테고리의 다른 글

ITaskSettings interface  (0) 2014.03.04
ILogonTrigger interface  (0) 2014.03.03
PathFindSuffixArray 경로에 찾고자 하는 문자열 있는지 확인  (0) 2013.01.16

const 과 #define

① #define이 정의하는 매크로 상수는 타입을 지정할 수 없지만 const는 타입을 명확하게 지정할 수 있다. 위 예에서 Day는 실수 24.0이나 문자열 "24"가 아닌 정수형의 24라는 것을 분명하게 지정한다. C++은 타입을 중요시하기 때문에 상수의 정확한 타입이 의미를 가지는 경우가 있다.

② 매크로 상수는 일단 정의된 후에는 언제든지 어느 곳에서나 사용할 수 있지만 const는 통용 범위 규칙의 적용을 받기 때문에 자신이 선언된 범위 내에서만 사용할 수 있다. 함수 내부에서 선언한 상수는 함수 내부에서만 사용할 수 있으며 함수 밖으로는 알려지지 않는다. 즉, 지역 상수를 만들 수 있으며 명칭간의 충돌을 최소화할 수 있다.

③ #define은 컴파일러가 아닌 전처리기에 의해 치환되기 때문에 실제 소스에는 매크로가 치환된 상태로 실행된다. 그래서 디버깅 중에 매크로 상수의 값을 확인해 볼 수 없으며 아무리 간단한 버그라도 확인이 안되면 잡기가 어렵다. 반면 const 상수는 컴파일러가 처리하기 때문에 디버깅 중에도 값을 확인해 볼 수 있어 복잡한 단계를 통해 정의된 상수의 값도 쉽게 살펴볼 수 있다.

④ 매크로는 기계적으로 치환되기 때문에 부작용이 발생할 소지가 많다. 괄호를 싸지 않으면 연산 순위에 의해 예상하지 못한 값이 될 위험이 있다. 그러나 const 상수는 컴파일러가 문맥에 맞게 처리하므로 이런 부작용이 거의 없다. #define A 1+2의 A는 3이 될 가능성이 있을 뿐 주변 연산문에 따라 3이 아닐 수도 있지만 const int A=1+2;는 어떤 경우라도 3이다.



=======================================================================================================


함수 포인터 사용 하는 것이 좋을 때


① 선택해야 할 함수가 두 개 이상인 경우, 예를 들어 수십개의 함수중 하나를 호출해야 한다면 함수 포인터 배열을 선언하고 그 첨자를 선택하는 것이 더 쉽다.

② 함수를 선택하는 시점과 실제로 호출하는 시점이 완전히 분리되어 있는 경우도 함수 포인터를 쓰는 것이 유리하다. 호출할 함수에 대한 조건 점검은 필요할 때 한 번만 하고 선택된 함수는 별다른 조건 점검없이 함수 포인터로 바로 호출할 수 있다.

③ 호출할 함수가 DLL같은 외부 모듈에 있고 이 함수를 동적으로 연결할 경우는 컴파일할 때 함수의 존재가 알려지지 않으므로 반드시 함수 포인터를 사용해야 한다. 함수 포인터를 사용하면 이름으로부터 원하는 함수의 번지를 찾아 호출할 수 있다.

 



'c/c++' 카테고리의 다른 글

ip/ mac 주소 얻기  (0) 2013.02.25
서비스  (0) 2013.02.25
구조체  (0) 2013.01.30
함수에서 값을 반환하는 방법  (0) 2013.01.18
CAtlArray 예제  (0) 2013.01.10

구조체

구조체 포인터를 함수 인수로 전달 vs 구조체를 함수 인수로 전달


하지만 몇 가지 차이점이 존재하는데 우선 포인터를 통해 참조 호출을 했으므로 함수 내부에서 구조체를 변경할 수 있다. 형식 인수가 실인수의 사본이 아니라 번지를 알고 있으므로 -> 연산자로 실인수 자체를 읽고 쓸 수 있는 것이다. 그리고 성능상으로도 확연한 차이가 있는데 두말할 필요없이 포인터를 전달하는 방식이 훨씬 더 빠르다. 구조체는 보통 수십 바이트이고 커지면 수백 바이트 이상이 될 수 있지만 포인터는 기껏해야 4바이트밖에 안된다.

구조체를 통째로 복사하여 전달하는 데 걸리는 시간과 4바이트의 포인터를 전달하는 데 걸리는 시간은 비교해 보나 마나다. 그래서 구조체를 함수끼리 전달해야 할 필요가 있을 때는 보통 포인터를 사용한다. 단, 구조체가 아주 작다면 가령 10바이트 정도밖에 안된다면 이런 경우는 성능상의 불이익이 별로 없으므로 구조체를 그냥 넘기는 것이 더 편리하다.

'c/c++' 카테고리의 다른 글

서비스  (0) 2013.02.25
const 과 #define  (0) 2013.01.30
함수에서 값을 반환하는 방법  (0) 2013.01.18
CAtlArray 예제  (0) 2013.01.10
IPC  (0) 2013.01.08

함수에서 값을 반환하는 방법

함수에서 값을 반환할때 사용하는 방법은 

return 말고 또 한가지 throw 도 있다.


  1. return 사용
    -> 리턴 값이 영향을 주는 부분이 없을 때 사용 
    throw를 하면 값을 전달 하는 것으로 catch를 함수를 호출 한 부분에서 해주어야 함

    ex) int test()
    {
        int a;
        try{
                throw a;
            }
        catch(...){
                        }
    }
    test 함수 안에서 catch 하면 값 반환도 안됌 catch 안에서 return 해줘야 하는데 일을 두번함 


  2. throw 사용
    리턴 값 자체가 기능을 위해서 필요 할 때 사용
    ex) char* GetStrhig()
    -> 오류가 발생하면 null 포인터를 반환하면 되지만,
    CString GetString()일 경우 
    null 포인터를 반환하면 에러 발생한당 이럴때 throw로 에러가 발생함을 알리면 됌


'c/c++' 카테고리의 다른 글

const 과 #define  (0) 2013.01.30
구조체  (0) 2013.01.30
CAtlArray 예제  (0) 2013.01.10
IPC  (0) 2013.01.08
레지스트리  (0) 2013.01.03

PathFindSuffixArray 경로에 찾고자 하는 문자열 있는지 확인

#include <stdio.h>

#include <Windows.h>

#include <shlwapi.h>


#pragma comment(lib, "shlwapi.lib")



int main()

{

char lpPath[] = "c:\\Windows\\System32\\notepad.exe";

char *apszSuffix[] = {"zip", "exe", "txt"};

int nSuffixSize = sizeof(apszSuffix) / sizeof(apszSuffix[0]);

const char *lpMathedSuffix;


lpMathedSuffix = PathFindSuffixArray(lpPath, apszSuffix, nSuffixSize);


if(lpMathedSuffix != NULL)

printf("Match : %s\n", lpMathedSuffix);

else

puts("Suffix does not matched");


return 0;

}


'c/c++ > 레퍼런스' 카테고리의 다른 글

ITaskSettings interface  (0) 2014.03.04
ILogonTrigger interface  (0) 2014.03.03
Shellexecute()  (0) 2013.02.06

CAtlArray 예제

#include <stdio.h>


#include <atlcoll.h>

#include <Windows.h>

#include <atlstr.h>


//구조체 ROW로 이루어진 배열을 만드려고 함 

struct ROW

{

int a;

int b;

ROW(int aa, int ab)

{

a = aa;

b = ab;

}


};

//이렇게

static CAtlArray <ROW> table;


int main()

{

// table 배열(ROW 구조체로 이루어진)에 아이템 추가

table.Add(ROW(1,5));


int i = table.GetCount();

printf("%d",i); // 위에 한개 Add 해주었으니 Count는 1


// 사용할때는 table의 배열로

printf("%d %d\n",table[0].a, table[0].b); 

}


CAtlArray는 동적으로 축소 및 필요에 따라 증가 한다

확장 가능

( 이거는 그러면 따로 free 안해줘도 되나 ? ㅜㅜ)



'c/c++' 카테고리의 다른 글

구조체  (0) 2013.01.30
함수에서 값을 반환하는 방법  (0) 2013.01.18
IPC  (0) 2013.01.08
레지스트리  (0) 2013.01.03
참조자 & 포인터  (0) 2012.12.18

IPC

제33장 IPC
1.IPC
가.IPC란
나.여러 가지 방법


다.메시지

#define WM_IPC WM_USER+1

 HWND hWnd2 = FindWindow(NULL,"IPCMessage2");

if(hWnd2 != NULL)

SendMessage(hWnd2,WM_IPC,(WPARAM)1234,(LPARMA)0);


#define WM_IPC WM_USER+1 

case WM_IPC:

//wParam 으로 메시지 넘어 옴

char str[128];

wsprintf(str, %d, wParam);

return 0;


FindWindow 함수로 IPCMessage2 윈도우 핸들을 구한 후 WM_IPC 메시지를 IPCMessage2로 전달하되 이때 wParam으로 전달하고자 하는 정수를 넘긴다

wParma은 8바이트


=> 정수와 같은 비교적 크기가 크지 않은 정보를 전달할때 , 단순한 어떤 사실을 통보하기 위한 목적 


라.WM_COPYDATA


2.아톰
가.아톰 테이블
나.로컬 아톰 테이블
다.글로벌 아툼
라.윈도우 클래스 아톰
3.메일 슬롯
가.메일 슬롯
나.메일 슬롯 서버
다.메일 슬롯 클라이언트


메일슬롯은 네트웍 통신은 가능하지만 단방향으로만 통신이 가능하며 클라이언트가 보낸 메시지를 서버가 알 수 없다는 단점이 있다

그러나 메일슬롯은 도메인 내의 모든 메일 슬롯에게 한꺼번에 메시지를 전달 할 수 있다는 장점을 가진다


4.파이프

연속적인 바이트 스트림을 교환할 때 


가.이름없는 파이프

부모 자식간의 단방향 통신에만 사용 

CreatePipe()
나.파이프

양방향으로 데이터를 주고 받을 수 있음

파이프 서버 : 파이프를 최초로 만듬

파이프 클라이언트 : 만든 파이프에 접속

복수개의 클라이언트 존재 할 수 있음 


CreateNamedPipe()

lpName \\서버명\pipe\파이프이름


CreateFile로 파이프에 접속


ConnectNamedPipe()


ReadFile, WriteFile로 상호 통신


다.파이프 인스턴스


5.DDE
가.DDE 소개
나.DDE의 구성 요소
다.DDE 메시지
라.DDEExam
마.lParam
바.기타


http://carpedm20.blogspot.kr/2012/08/7-ipc-1.html


'c/c++' 카테고리의 다른 글

함수에서 값을 반환하는 방법  (0) 2013.01.18
CAtlArray 예제  (0) 2013.01.10
레지스트리  (0) 2013.01.03
참조자 & 포인터  (0) 2012.12.18
static 정적 변수 정리  (0) 2012.12.18

레지스트리

#include <windows.h>


HKEY key;

DWORD dwDisp;

DWORD data=0;

char * value = "value";



//키 생성 

RegcreateKyeEx(HKEY_CLASSES_ROOT,"Software\\Microsoft\\NET Framework Setup\\NDP\\",0,NULL,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,NULL,&key, &dwDisp);

// 값 등록

RegSetValueEx(key, NULL, 0, REG_SZ(LPBYTE)value,strlen(value));

//읽기위한 키 오픈

RegOpenKeyEx(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\NET Framework Setup\\NDP\\", 0,KEY_READ, &hKey);

// "Install"값 data에 읽기 

RegQueryValueEx(hKey, "Install", NULL, NULL,(LPBYTE)&data, &dwBufLen);

RegCloseKey(hkey);



#include <Shlwapi.h> // SHDeletekey()

#pragma comment(lib, "shlwapi.lib")


// 키 삭제 (삭제하려는 키를 Open 후 SHDeleteKey 해줌)

SHDeletekey(hKey,"")



'c/c++' 카테고리의 다른 글

CAtlArray 예제  (0) 2013.01.10
IPC  (0) 2013.01.08
참조자 & 포인터  (0) 2012.12.18
static 정적 변수 정리  (0) 2012.12.18
[DLL] dll import하기  (0) 2012.12.17

참조자 & 포인터


 1. 참조자랑 포인터는 것모습만 다르다. 

참조자 : root.main.MAIN();


포인터 : if(root.main)

root.main->MAIN();

 2. 참조자는 널값을 가질수 없다.

 

 3. 포인터는 배열도 받는다.

 void Func(char& pC);

 char c; // 이것만 받겠다.

 char* pc;

 char ac[123];

 Func(&c);

 Func(pc);

 Func(ac);

'c/c++' 카테고리의 다른 글

IPC  (0) 2013.01.08
레지스트리  (0) 2013.01.03
static 정적 변수 정리  (0) 2012.12.18
[DLL] dll import하기  (0) 2012.12.17
디렉토리 파일 개수 구하기(하위 디렉토리 포함 )  (0) 2012.12.12

static 정적 변수 정리

메모리의 차이 : 일반 변수는 스텍에 static 변수는 힙에 


사용 되는 종류


1. 지역 static 변수

 함수가 종료 되어도 

변수 값이 사라지지 않는다.

=> 따라서 두번 이상 선언해도 의미 없음

 


 int fun()

{

static int a = 0;

a++;

return a;

}

void main()

{

for(int i = 0; i<10; i++)

printf("%d", fun());

}


fun 함수를 10번 호출 하는데 함수 내에서 int a = 0을 해주었는데도 불구하고

결과는 12345678910 으로 나온다 

왠지 여기서 의도치 않은 결과가 많이 나올 것 같다






2. 전역 static 변수, static 함수()

cpp,마다 사용 한다.


extern 은 cpp파일 상관 없이 모든 프로젝트에서 전역 변수를 공유 하는데

static 변수는 cpp 마다 변수를 공유한다 




3. 클래스 내의 static 함수

멤버 변수를 사용하지 않음

public, private, protect 

이런거 상관 없ㅋ엉ㅋ 걍 안써ㅋㅋ


그럼 어떤 변수를 사용하느냐면

함수 인자로 들어오는 파라메터 들을 이용한다.





 class c

{

private:

int ca,cb; 

public:

c()

{

ca = 1;

cb = 2;

}

static int add()

{

int r;

r = ca+cb;

return r;

}

};


int main()

{

c C;

printf("%d\n", C.add());


return 0;

 }


- 에러 발생



이 함수는 클래스.함수 이렇게 사용하지 않고,

클래스->함수 이렇게 사용한다.

즉 오브젝트를 만들지 않고 사용 가능 하다

그럼 메모리에 좋다


'c/c++' 카테고리의 다른 글

레지스트리  (0) 2013.01.03
참조자 & 포인터  (0) 2012.12.18
[DLL] dll import하기  (0) 2012.12.17
디렉토리 파일 개수 구하기(하위 디렉토리 포함 )  (0) 2012.12.12
[LNK 2001] DLL 포함 시키기  (0) 2012.12.04