GlobalAlloc

프로그래밍/C++ 2009. 2. 3. 11:51
소스를 분석하다가 GlobalAlloc() 라는 함수를 보았습니다.
이게 어디에 쓰는 물건인고? 하니
Heap 메모리 할당을 위한 함수였다. 아니 이런 10년 전에나 쓰던함수(정말이다.)를
보게 되다니...

하지만 하위호환성을 위해서나 클립보드,DDE,커스텀 리소스에서는 이함수를 쓰고 있다고 합니다.


대충 이런식으로 쓰입니다.

GlobalAlloc() 의 구조는 아래와 같습니다.

' wFlags : 메모리 할당 방법
' dwBytes : 할당 공간(Byte)
Private Const GMEM_MOVEABLE = &H2                       '## 이동 가능한 메모리 할당
Private Const GMEM_ZEROINIT = &H40                      '## 메모리 내용 초기화
Private Const GMEM_DISCARDABLE = &H100                  '## 삭제 가능한 메모리 할당
Private Const GMEM_FIXED = &H0                          '## 고정 메모리 할당
Private Const GPTR = (GMEM_FIXED Or GMEM_ZEROINIT)

Private Declare Function GlobalAlloc Lib "kernel32" ( _
                                               ByVal wFlags As Long, _
                                               ByVal dwBytes As Long) As Long

Posted by 빨강토끼
,
만약에 123456789 라는 숫자를 123,456,789 라는 식으로 표현하고 싶다면
사용할수있는 API 함수가 바로 GetNumberFormat 입니다.

네이버등을 통해서 검색해보면 사용법을 알수가 있는데
무작정 사용하는 것 보다는 좀더 옵션에 대하여 알아야 될것 같아서 정리해봅니다.

void InsertComma(double parm_num, char parm_buffer[])
{
    CString str;
 
    str.Format("%f", parm_num);
    NUMBERFMT fmt = {0, 0, 3, ".", ",", 1};

    // GetNumberFormat의 인자는 LOCALE_SYSTEM_DEFAULT, 플래그, 문자열 숫자, 문자열 포맷,
    // 변환된 문자열 숫자, 버퍼 사이즈이다.
    ::GetNumberFormat(NULL, NULL, str, &fmt, parm_buffer, strlen(parm_num));
}

소스출처 : http://www.tipssoft.com/bulletin/board.php?bo_table=FAQ&wr_id=235&page=5

NUMBERFMT 의 구조는 아래와 같습니다.
Type NUMBERFMT
 NumDigits As Long
LeadingZero As Long
Grouping As Long
lpDecimalSep As String
lpThousandSep As String
NegativeOrder >As Long
End Type

NumDigits
  : 소숫점이하를 표시할 자릿수

LeadingZero
 
: 만약에 0라면 NumDigits 에서 선언한 자리수에 0 을 채워넣지않고 만일 0 이외의 값이라면
    0을 채워넣는다. (예를 들어 NumDigits 가 3이고 숫자가 1.23 이라면 그리고 LeadingZero 가
    0이라면 1.23 이라고 변환 될것이고 만일 LeadingZero 가 0 이외의 값이라면 1.230 이라고
    변환 될것임)

Grouping
  : 구분할 단위값을 정의합니다. 일반적으로 3을 사용하고 1,234,567 라고 변환된다. 0~9 까지 가능하다.

lpDecimalSep
  : 소숫점을 표현할 character 를 정의한다.

lpThousandSep
  : 단위 구분자를 표현할 character 를 정의한다.

NegativeOrder
  : 음수값을 변환하는 방법을 정의한다.
  예) -11.1
   0 일 경우 11.1
   1 일 경우 -11.1
   2 일 경우 - 11.1 ( - 다음에 space 를 삽입한다.)
   3 일 경우 11.1-
   4 일 경우 11.1 - ( - 전에 space 를 삽입한다.)

참조 : http://www.codebible.com/APIGuide/ref/numberfmt.asp
Posted by 빨강토끼
,
정렬하고 싶은 구간영역을 선택후에
Alt + F8 입니다.
Posted by 빨강토끼
,
닷넷 플레임워크와 Visual Studio는 모두 Side-by-Side 설치를 지원합니다.
하나의 컴퓨터에 여러 버전의 닷넷 프레임워크와 Visual Studio를 설치할수있습니다.
예를 들어 Windows XP SP2가 설치되 컴퓨터에 Visual Studio 2003,2005,2008의 설치가 가능합니다.
이들은 모두 고유의 설치 디렉토리를 기지므로 설치 상 출동이 발생하지 않는다.

Visual Studio를 제외한 닷넷 프레임워크만 설치하는 경우 좋은 점은
설치 순서가 중요하지 않다는 것입니다.
즉, 2.0을 먼저 설치하였더라도 나중에 1.1을 설치할 수 있습니다.
3.0을 설치하면 2.0은 자동으로 설치되며 3.5를 설치하면 2.0 및 3.0이 설치된다.
그러므로 해당 하위프레임워크는 설치하지 않아도 된다.
그러나 3.0 이나 3.5를 설치하더라도 1.1은 자동으로 설치되지않습니다.

Visual Studio 는 개발도구의 설정이 서로 공유되는 부분이 있어 설치 순서를 맞추는것이 좋습니다.
가급적이면 2003.2005,2008 의 순서를 따르는 것이 좋습니다.
그리고 2008을 설치하고자 하는 경우, 2005는 철치하지 않아도 되는데 2008 버전이
2005 버전에 대한 상위 집합으로써 2005가 갖는 모든 기능을 포함하기 때문입니다.

아래는 Side-by-Side 설치시 권고 사항입니다.
  • 닷넷 프레임워크 1.0과 Visual Studio.NET은 가급적 사용하지 않는다.대신 1.1을 사용하도록 한다.
  • Viusal Studio 버전은 출시 일정에 따라 2003,2005,2008 순으로 설치한다.
  • Visual Studio의 여러 버전을 설치 한 후, 언 인스톨을 하는 경우 이미 설치된 Visual Studio에 대해
    Repair를 수행한다.
  • Windows Vista는 Visual Studio 2003 버전을 지원하지 않으므로 설치 하지 않는다. 단 닷넷 프레임워크
    1.1은 설치하고 사용할 수 있다.
  • Windows Vista만 사용한다면 Visual Studio 2008에 한해 사용하는 것이 유리하다.
Windows Vista는 Visual Studio 2003을 지원하지 않음에 유의합니다.
설치는 가능하지만 레지스트리가 꼬이는 것은 물론 일부 작업 도중 Visual Studio가 다운 되는 현상도
발생하므로 가급적 사용하지 않는 것이 좋습니다.
또한 2005를 Windows Vista에서 사용하는 경우, 반드시 서비스 팩 1을 설치해야 할 뿐만 아니라
Update for Windows Vista 역시 설치해야 합니다.
Posted by 빨강토끼
,

저는 지금까지 개발작업을 하면서 SqlDataAdapter 를 사용하여 프로그래밍을 하였습니다.
SqlDataAdapter 가 더 좋은것이라는것을 알지만
그것 보다도

SqlDataReader 를 사용하여 프로그래밍을 하려고 할때

SqlCommand comm = new SqlCommand(쿼리문,DB연결)
SqlDataReader reader = comm.ExecuteReader();

While(reader.Read())
{
reader.GetInt64(0); // int i 열서수
...
}

이런식으로 reader 의 열서수만 넣을수있고 컬럼값을 넣지 못하는것때문에
번거롭기도 하고 코드를 수정하게 되면 문제가 생길소지가 있을것 같아서

처음에 번거롭더라도 SqlDataAdapter 를 사용하여 프로그래밍을 하였습니다.

그러다가 다른 방법이 있다는것을 알았습니다.

(Int64)reader["컬럼이름"]

이라고 입력하면 값을 얻을수있습니다.

reader.GetInt64(열서수)

(Int64)reader[열서수 or 열이름(컬럼이름)]

Posted by 빨강토끼
,
예전에 findwindow 를 통해서 특정 프로그램이 실행하지는 여부를 판별하는 법에 대하여
정리 했었습니다.

findwindow 사용법(VB , C++)


이것을 응용하여 중복실행을 방지하는 부분도 코딩을 하곤 했었는데
더 괜찮은 방법이 있으서 정리합니다.

바로 Mutex(뮤텍스) 입니다.

Mutex는 커널 오브젝트로 프로세스 핸들을 가집니다. (HANDLE)
주로 CriticalSection(크리티컬섹션)과 Semaphore(세마포어), 그리고 이벤트기법 과 함께
쓰레드등의 동기화 기법중 하나로 사용합니다.

뮤텍스는 이름을 가질수가 있는데 그로인하여서
  • 프로세스간에도 사용 가능합니다.
  • 크리티컬 섹션보다 우월합니다. -> 대신 그만큼 속도는 느림니다.--; (커널 오브젝트이기 때문에)
뮤텍스는 두 쓰레드가 동시에 소유할 수 없고 한 처음엔 signaled 이다가 쓰레드가 가지면
Non-signaled(비신호) 상태가 됩니다.

더깊은 얘기는 인터넷을 검색해보시기 바랍니다.
이글을 Mutex에 대한 설명보다는 Mutex를 이용하여 중복실행을 방지하는 법을 소개하겠습니다.

일단 함수 몇개를 소개하겠습니다.

뮤텍스 생성 합니다.



사용예



정리하고 나니깐 너무 간단하네요..ㅡㅡ;

findwindow() 등을 통한 방법과 비교해서 장점이라면
윈도우 클래스나 캡션은 중복 가능성이 많지만 뮤텍스는 이름을 복잡하게 주면 중복을 피할 수 있습니다.

마지막으로 뮤텍스 이름은 대소문자를 구분합니다.
대충 여러분이 만드시는 소스에서 어느부분에 어떻게 쓰실건가는 여러분이 알아서 쓰실거라 생각됩니다.
Posted by 빨강토끼
,
1. 이식성이 강하다 : 새로운 프로그램에 대한 강력한 이식성은 개발기간을 단축시킨다.
2. 유연성이 있다 : 컴으로 작업한 소프트웨어를 업그레이드 하고자 할 경우 단순히 업그레이드된 컴포턴트만 복사하면 되고 업그레이드 되지 않은 컴포넌트를 사용하지 않은 경우에도 잘 수행된다.
3. 재 컴파일할 필요가 없다.
4. 객체지향 개발 방법론(com) 은 프로그램의 구현방법을 획기적으로 바꾸었다.
5. com 의 경우 플랫폼에 독립적이다.
Posted by 빨강토끼
,
요즘 COM에 관심을 가져보고 있는데.

나의 COM(Component Object Model) 경험담 #1|작성자 저격수

라는 블로그글이 있어서 재미있게 보고 있습니다.
아직 다본게 아니라서 좋다 나쁘다를 평가하긴 머하지만

5번째 글중에 이미지가 깨져서 랜덤하게 새로운 GUID 를 생성하는 부분이
보이지 않아서 인터넷으로 찾아봤습니다.

윈도우의 실행에서 guidgen 이라고 입력하고 실행하면
해당 프로그램이 실행하여 새로운 guid 를 구하실수있습니다.

분명 몇년전에 COM관련 프로젝트를 했었는데 그땐 이런툴이 있는지도 몰랐는데
어떻게 COM을 만들었는지 모르겠습니다....--;

Posted by 빨강토끼
,
SQL Server 2005 Express 를 설치하고
Visual Web Developer 2008 Express 도 설치하였습니다.
DB에 연결하려고 하니 연결이 안되더라구요.
(windows 인증사용)

데이터베이스 탐색기 -> 데이터 연결 -> 연결추가
Microsoft SQL Server 를 선택합니다.

위와같은 연결추가 화면이 나타나는데...
아무리해도 연결이 되지 않았습니다....

서버에 연결하는 동안 오류가 발생했습니다. SQL Server 2005에 연결하는 경우 SQL Server 기본 설정에서는 원격 연결을 허용하지 않기 때문에 발생한 오류일 수 있습니다. (provider: 명명된 파이프 공급자, error: 40 - SQL Server에 대한 연결을 열 수 없습니다.)



인터넷을 찾아보다가 알아낸사실은
express에서는 기본적으로 로컬연결만 가능하게 되어있다는것입니다.
물론 설정을 바꾸면 자유롭게 원격에서도 연결이 가능합니다.
원격 연결을 허용하는 방법

하지만 지금은 로컬인데도 연결이 안되고 있었습니다.

이유는 위에 서버이름을 수정해야된다는것이 었습니다.
localhost\SQLExpress
로 수정하니 연결이 되었습니다.

  SQL Server 2005 Express와 춤을 추다

쿼리로 연결하거나 SQL Server 인증 사용은 인터넷을 찾아보시면 자료를 찾아보실수있습니다.
Posted by 빨강토끼
,
static 이란 정적변수로서 일반적인 변수와는 다르게 메모리 안에 계속 저장되어있습니다.
전역변수와 지역변수 앞에 static 키워드를 붙여서 선언할수있습니다.

전역변수에서 선언하면 프로그램이 실행될때 초기화되어 메모리에 알라가서
프로그램이 종료될때 사라집니다.

지역변수는 함수내에서 선언되면 메모리안에 저장되어 함수가 종료되어서도
사라지지않고 다시 함수를 호출시 그전의 값이 그대로 남아있어 사용할수있습니다.

예)
int a()
{
int a=1;
a+=1;
return a;
}

위와 같이 하면 함수를 호출할때마다 a = 2 를 반환합니다.
하지만,

int a()
{
static int a=1;
a+=1;
return a;
}

static int a=1; 는 한번만 실행되고 그후로부터 함수를 호출할때마다 1씩 증가된값을 반환합니다.
Posted by 빨강토끼
,