프로그램을 하다 보면, 웹페이지로 Redirect 해야 할 필요가 있을 때가 있다.
ShellExecute() 라는 API 함수를 사용하면 간단히 해결 가능하다.
Prototype는 다음과 같다.

HINSTANCE ShellExecute(
    HWND hwnd,
    LPCTSTR lpOperation,
    LPCTSTR lpFile,
    LPCTSTR lpParameters,
    LPCTSTR lpDirectory,
    INT nShowCmd
);

2번째 파라미터는 3가지 값을 가질 수 있다.
"open", "print", "explore" 가 그것인데, 웹 페이지로 Redirect 하기 위해서는 "explore" 를 사용해야 한다.
파라미터 이름에서 볼 수 있듯이 파일이나 폴더를 open하거나 print할 수도 있다.

웹 페이지 주소는 4번째 파라미터로 파일일 경우에는 접근할 파일을 의미한다.
(단 파일은 실행 가능한 파일이어야 한다)
웹페이지를 실행해야 하므로, 웹 페이지의 주소를 넣어 준다.
마지막으로, 디폴트 디렉토리와 실행 상수값을 입력하면 된다.
실행 상수는, 여러 개가 있으나 그 중 일부를 보면 다음과 같다.

SW_HIDE : 실행시 숨긴상태로 실행
SW_SHOW : 그냥 실행
SW_SHOWMAXIMIZED : 실행시 화면에 가득 차게 실행

Example Code
// Webpage-Redirect
::ShellExecute(NULL, _T("open"), _T("iexplore"), _T(http://naver.com), NULL, SW_SHOW);

// Excutable-File
::ShellExecute(NULL, _T("open"), _T("notepad.exe"), NULL, NULL, SW_SHOW);

MFC에서는 CAsyncSocket 라는 클래스를 기반으로 소켓을 정의해둠
CAsyncSocket에서는 Create() / Bind() / Listen() / Accept() / Connect() .. ETC

::Server
Create() 소켓 생성
Bind() 포트 지정
Listen() Connect() 신호대기 및 연결
Accept() 접근를 수락

::Client
Create() 소켓 생성
Connect() 서버로 접속 신호 보냄


공부한 것들 이제 정리한다 -_-;;
열심히 살겠다고 약속했다. 살길은 공부 뿐..

#1
in Unix -> file scripter
command line : "script" , "exit" use;
(Unix에서 화면 갈무리 방법)

#2
키보드 포커스를 얻는 법.
해당 컨트롤러에 컨트롤 변수를 추가한 후,
Control_Variable.SetFocus(); 함수를 호출한다.
호출 시점은 해당 컨트롤러 생성 이후.

#3
CString chat;                                    //Initialize chat variable
m_InputChat_C.GetWindowText(chat); //Get Text for 'editbox'
m_ChatView.AddString(chat);            //Send the Text of 'Getted Text'

#4 (by snbosoft.com)
CDialog 에서 IDOK에 대한 디폴트 키로서, Return 키가 할당되어있다.
비슷하게 Esc도 같은 기능인데, 원하지 않는 시점에서 프로그램이 종료될 수 있다.

이는 PretranslateMessage() 에서 메세지를 후킹함으로서 간단히 해결된다.

BOOL CTestDlg::PreTranslateMessage(MSG* pMsg)
{
  if( pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_RETURN )
    return TRUE;

  return CDialog::PreTranslateMessage(pMsg);
}

#5
CWnd *pWnd = CWnd::GetDlgItem(해당 컨트롤러ID); //get pointer of 'editbox'
pWnd->SetWindowText(_T("초기화할 문자열")); //Re-Initialize of 'editbox'

#6
버튼 활성화/비활성화 방법(MFC)
해당 버튼의 컨트롤 변수를 만든 다음,

Control_Variable.EnableWindow(진리값);

진리값이 TRUE일 경우 = 비활성화 버튼을 활성화로
        FALSE일 경우 = 활성화 버튼을 비활성화로

#7 (About Button activation)
BOOL EnableWindow(
  HWND hWnd,     // handle to window
  BOOL bEnable   // flag for enabling or disabling input
);

함수는 리턴값이

If the window was previously disabled, the return value is nonzero.
If the window was not previously disabled, the return value is zero. To get extended error information, callGetLastError.

이므로, 비활성화시, nonzero를 리턴한다.
즉, 이 함수를 이용하여 체크를 하면 그만이다. 다시 돌려놓으면 되니까..
다른 함수가 있을려나 -_-?

if((Control_Variable.EnableWindow(FALSE)))  //Running Server

else       //or, not
//to do
Control_Variable.EnableWindow(TRUE);

BOOL
Boolean 값을 나타내는 정수 값이다. 여기서는 0이나 1의 값이 들어간다.

BSTR
32비트 character 포인터 값을 의미한다. 자주 보게 되지 않을 것이다.

BYTE
unsigned 8비트 정수 값이다. 이를 좀더 보기 쉽게 정의하면 unsingned char정도로 이해하면된다.

COLORREF
색상을 나타내는 32비트 값이며, 보통은 RGB매크로를 이용하여 값을 넣는다.
ex) RGB(255,255,255)

DWORD
32비트 unsigned 정수이며, 상당히 자주 사용되는 데이터 타입이다. 결국 unsinged int 정도로 보면 될 것이다.

LONG
32비트 singned 정수 값이다. ( 일반 int형도 32비트) LONGLONG형으로 사용할 경우 이 형은 double형과 같은 크기를 가지는 64비트 데이터 형이다.

LPARAM
32비트 값. 윈도우 프로시저 함수 같은 것에 인자로 넘어오는 데이터형 중 하나다.

LPCSTR
32비트 스트링 포인터인데, const형이다. 따라서 const char*정도로 보면 될 것 이다.

LPSTR
32비트 스트링 포인터

LPCTSTR
유니코드 스트링을 포인트할 수 있는 cont 32비트 스트링 포인터

LPTSTR
유니코드 스트링을 포이트할 수 있는 32비트 스트링 포인터

LPVOID
32비트 void포인터

LRESULT
윈도우 프로시저나 콜백함수가 리턴하는 32비트 값

UINT
32비트 unsigned int형

WNDPROC
윈도우 프로시저 함수를 포이트하는 32비트 포인터

WORD
16비트 unsigned int 값

WPARAM
LPARAM과 동일

POSITION
MFC collection 클래스(예:CPtrList)에서 객체를 포이트하는 값

LPCRECT
RECT 구조체를 포이트하는 값

※ LP라는 접두사가 붙은것은 포인터임.

#include <iostream.h>
#include <string.h>

//클래스의 정의
class Employee
{
public:
int number;
char name[80];
long pay;
void ShowData();
};

//멤버함수의 정의
void Employee::ShowData()
{
cout << number << "\n";
cout << name << "\n";
cout << pay << "\n";
}

//클래스의 정의
class MyClass
{
public:
//객체의 포인터를 인수로 하는 멤버 함수
void UseObject(Employee *obj);

//객체의 포인터를 리턴하는 멤버 함수
Employee *RetObject(void);
};

//멤버 함수의 정의
void MyClass::UseObject(Employee *obj)
{
obj->ShowData();
}

Employee *MyClass::RetObject(void)
{
static Employee obj; //객체 소멸방지(static)

obj.number = 1234;
strcpy(obj.name, "김병호");
obj.pay = 2000000;

return &obj;
}

//클래스를 사용하는 측의 코드
void main(void)
{
Employee *someone;
MyClass mc;

//객체의 포인터를 취득한다
someone = &mc.RetObject();

//객체의 포인터를 함수에 대입한다
mc.UseObject(someone);
}
컴파일 에러난다. 2차원 배열인 z를 char ** 로 받지 못한다고 벌신다.
나쁜놈...

#include <stdio.h>

void a(char **a);

void main(){
char z[10][10];
a(z);
}

void a(char **a){
strcpy(a[1],"asdf");
printf("%s",z[1]);
}

파라메터값으로 2차원 배열을 쓰지 못하는 것은 아닐텐데...
아쉬운데로, 호출측 함수에 임시 포인터를 만들어 물린다음,
그 포인터를 넘긴다.

#include <stdio.h>

void func( char **p )
{
printf( "%s\n", p[0] );
}

void main()
{
char z[10][10] = {"Hi!"};
char *b = z[0];
func( &b );
}

'지혜 이야기 > C/C++' 카테고리의 다른 글

Windows Prog. DataType  (3) 2006/03/28
객체를 (파라메터/리턴값)으로 사용하는 함수  (0) 2006/03/03
함수 호출시 2차원 배열을 파라메터로 사용할 수 없다???  (2) 2006/01/26
strcmp() 구현  (0) 2006/01/25
fseek() 함수  (1) 2006/01/19
strcmp() 함수  (0) 2006/01/19
strcmp() 구현
from 지혜 이야기/C/C++ 2006/01/25 15:06
int ustrcmp(char *a, char *b)
{
while (*a == *b && *a != 0)
{
a++;
b++;
}
return *a - *b;
}

'지혜 이야기 > C/C++' 카테고리의 다른 글

객체를 (파라메터/리턴값)으로 사용하는 함수  (0) 2006/03/03
함수 호출시 2차원 배열을 파라메터로 사용할 수 없다???  (2) 2006/01/26
strcmp() 구현  (0) 2006/01/25
fseek() 함수  (1) 2006/01/19
strcmp() 함수  (0) 2006/01/19
GetTickCount() Function  (1) 2006/01/16
fseek() 함수
from 지혜 이야기/C/C++ 2006/01/19 14:13
fseek() : 파일 포인터를 특정 위치로 이동시킨다.

int fseek(FILE *fp, long offset, int origin);

*fp : 파일과 연결된 FILE 포인터
offset : 위치 표시자가 이동하는 거리(바이트 단위)
orgin : SEEK_SET 0 파일의 시작 부분으로부터 표시자를 offset 바이트 이동
orgin : SEEK_CUR 1 파일의 현재 위치로부터 표시자를 offset 바이트 이동
orgin : SEEK_END 2 파일의 끝에서부터 표시자를 offset 바이트 이동

'지혜 이야기 > C/C++' 카테고리의 다른 글

객체를 (파라메터/리턴값)으로 사용하는 함수  (0) 2006/03/03
함수 호출시 2차원 배열을 파라메터로 사용할 수 없다???  (2) 2006/01/26
strcmp() 구현  (0) 2006/01/25
fseek() 함수  (1) 2006/01/19
strcmp() 함수  (0) 2006/01/19
GetTickCount() Function  (1) 2006/01/16
strcmp() 함수
from 지혜 이야기/C/C++ 2006/01/19 13:33
strcmp() : 두개의 문자열을 한 문장씩 비교, string.h에 정의

int strcmp(char *str1, char *str2);

// 함수 원형을 보면 int형을 반환값으로 갖고 있음.


Return value ?

When, str1이 str2보다 작으면 < 0 값 반환
When, str1이 str2와 같으면 0 값 반환
When, str1이 str2보다 크면 >0 값 반환

'지혜 이야기 > C/C++' 카테고리의 다른 글

객체를 (파라메터/리턴값)으로 사용하는 함수  (0) 2006/03/03
함수 호출시 2차원 배열을 파라메터로 사용할 수 없다???  (2) 2006/01/26
strcmp() 구현  (0) 2006/01/25
fseek() 함수  (1) 2006/01/19
strcmp() 함수  (0) 2006/01/19
GetTickCount() Function  (1) 2006/01/16
어떤 명령어의 수행시간을 측정하고 싶을때가 있다.
이때 유용하게 사용할수 있는 함수가 GetTickCount()이다.

GetTickCount()함수는 시스템이 시작 된 후 얼마의 시간이 경과했는지를 반환한다. 단위는 밀리세컨드 단위이다. 참고로 경과시간은 DWORD(32비트 값)이므로 최대 49.7일이 지나면 다시 0으로 된다고 한다.

The GetTickCount function retrieves the number of milliseconds that have elapsed since the system was started. It is limited to the resolution of the system timer. To obtain the system timer resolution, use the GetSystemTimeAdjustment function.

DWORD GetTickCount(void);

Parameters : This function has no parameters.
Return values : The return value is the number of milliseconds that have elapsed since the system was started.


#include <iostream>
#include <windows.h> //GetTickCount()함수 이용을 위해 추가한다.

using namespace std;

void main()
{
long startTime = GetTickCount(); //현재 시각을 저장한다.(시작지점)

for(int i=0; i<100000; i++) //시간 딜레이를 주기 위해 i값을 출력한다.
cout<<i<<endl;; //여기서는 테스트 하기 위한 명령어라고 보면 된다.

long endTime = GetTickCount(); //현재 시각을 저장한다.(종료지점)
long tickDiff = endTime - startTime; //수행시간 = 종료시각 - 시작시각
long secDiff = tickDiff / 1000 ; //이건 초단위로도 나타내기 위한 것.

cout<<"Start Time : "<<startTime<<"ms"<<endl; //시작시각
cout<<"End Time : "<<endTime<<"ms"<<endl; //종료시각
cout<<"Tick difference : "<<tickDiff<<"ms"<<endl; //밀리세컨드 단위
cout<<"Second difference : "<<secDiff<<"s"<<endl; //초단위
}

'지혜 이야기 > C/C++' 카테고리의 다른 글

객체를 (파라메터/리턴값)으로 사용하는 함수  (0) 2006/03/03
함수 호출시 2차원 배열을 파라메터로 사용할 수 없다???  (2) 2006/01/26
strcmp() 구현  (0) 2006/01/25
fseek() 함수  (1) 2006/01/19
strcmp() 함수  (0) 2006/01/19
GetTickCount() Function  (1) 2006/01/16