출처 : http://www.elevatesoft.com/bulletin_13.htm

TCPServer사용할 때 아래와 같은 에러가 나면 Conditional defines에 "_WINSOCKAPI_"을 추가하면 해결 된다.

[C++ Error] winsock2.h(109): E2238 Multiple declaration for 'fd_set'
[C++ Error] winsock.h(54): E2344 Earlier declaration of 'fd_set'
[C++ Error] winsock2.h(112): E2146 Need an identifier to declare
[C++ Error] winsock2.h(153): E2238 Multiple declaration for 'timeval'
[C++ Error] winsock.h(97): E2344 Earlier declaration of 'timeval'
[C++ Error] winsock2.h(209): E2238 Multiple declaration for 'hostent'
[C++ Error] winsock.h(153): E2344 Earlier declaration of 'hostent'
[C++ Error] winsock2.h(222): E2238 Multiple declaration for 'netent'
[C++ Error] winsock.h(166): E2344 Earlier declaration of 'netent'
[C++ Error] winsock2.h(229): E2238 Multiple declaration for 'servent'
[C++ Error] winsock.h(173): E2344 Earlier declaration of 'servent'
[C++ Error] winsock2.h(241): E2238 Multiple declaration for 'protoent'
[C++ Error] winsock.h(185): E2344 Earlier declaration of 'protoent'
[C++ Error] winsock2.h(327): E2238 Multiple declaration for 'in_addr'
[C++ Error] winsock.h(269): E2344 Earlier declaration of 'in_addr'
[C++ Error] winsock2.h(385): E2238 Multiple declaration for 'sockaddr_in'
[C++ Error] winsock.h(319): E2344 Earlier declaration of 'sockaddr_in'
[C++ Error] winsock2.h(395): E2238 Multiple declaration for 'WSAData'
[C++ Error] winsock.h(329): E2344 Earlier declaration of 'WSAData'
[C++ Error] winsock2.h(411): E2146 Need an identifier to declare
[C++ Error] winsock2.h(546): E2238 Multiple declaration for 'sockaddr'
[C++ Error] winsock.h(492): E2344 Earlier declaration of 'sockaddr'
[C++ Error] winsock2.h(586): E2238 Multiple declaration for 'sockproto'
[C++ Error] winsock.h(501): E2344 Earlier declaration of 'sockproto'
[C++ Error] winsock2.h(625): E2238 Multiple declaration for 'linger'
[C++ Error] winsock2.h(625): E2228 Too many error or warning messages
Posted by Gu Youn
,
아웃룩에서 IMAP으로 익스체인지 연결해서 사용하면 삭제시에 서버에 반영이 안되는 불편함이 있는데 MS 사이트 가서 찾아보니 아래와 같은 방법이 나와 있다. 역시 무식하면 손발이 고생이다... ㅎㅎ

-----------------------------

IMAP 폴더에서 지운 항목 복원 및 제거   도움말
도움말 > Outlook 2003 > 전자 메일 > 전자 메일 계정 구성 > IMAP 폴더

모두 표시
모두 숨기기
IMAP (IMAP(Internet Message Access Protocol): POP3 같은 인터넷 전자 메일 프로토콜과 달리 IMAP는 다른 컴퓨터에서 검색할 수 있도록 서버에 폴더를 만들어 메시지를 저장하고 구성합니다. 메시지 머리글만 읽을 수 있고 다운로드할 메시지를 선택할 수 있습니다.) 폴더를 사용하면 삭제한 것으로 표시된 메시지를 복원할 수 있습니다. 삭제된 메시지에는 줄이 그어집니다. 삭제한 메시지를 영구히 제거할 수도 있습니다. 삭제한 메시지를 제거하면 서버에서 삭제되며 복원할 수 없습니다. 메시지 제거는 Microsoft Windows 바탕 화면에서 휴지통을 비우는 것과 유사합니다.

지운 항목 복원

삭제한 메시지를 선택합니다.
편집 메뉴에서 삭제 취소를 클릭합니다.
삭제된 것으로 표시된 모든 메시지를 빠르게 보려면 보기 메뉴에서 정렬 기준과 현재 보기를 차례로 가리킨 다음 삭제된 것으로 표시된 메시지 묶기를 클릭합니다.

삭제한 항목 제거

편집 메뉴에서 삭제한 메시지 비우기를 클릭합니다.
출처 : http://office.microsoft.com/ko-kr/assistance/HP052426151042.aspx
Posted by Gu Youn
,
Indy 설치 및 사용에 관한 포스트로 시간이 날 때마다 업데이트 할 예정이다.

(1). Install Indy For C+ Builder
1. BCB Library & Incude Path 설정
  ㄱ. Tools->Environment Options->Library Path에 아래의 두 경로를 추가한다.
   a . Indy Source 디렉토리
   b. 컴파일된 dcu와 hpp 헤더 디렉토리

  ㄴ. Project->Options->Library Path에는 컴파일된 dcu와 hpp 헤더 경로추가한다.  
  ㄷ. Project->Options->Include Path에는 hpp 헤더 경로를 추가한다.

(2). Indy 관련된 포스트
1.BCB에 설치된 Indy가 이상하게 동작 할때...(http://kr.blog.yahoo.com/guyoun/83.html)

2.C++ Builder 6에 Indy 10 설치 하기(http://kr.blog.yahoo.com/guyoun/82.html)
Posted by Gu Youn
,

<배포>
1. BCB에서 컴포넌트 패키지(bpk 파일)을 열고, 프로젝트 옵션의 디렉토리 탭에서 final output, BPI/LIB output 항목을 현재 디렉토리로 변경한다.


2. 빌드를 하면 bpi, lib, bpl, obj, hpp(컴포넌트에 델파이 소스가 포함된 경우) 등의 파일이 만들어 진다.

3. 배포할 파일을 모을 디렉토리를 만들고 소스파일(.cpp, .pas)를 제외한 파일들을 복사하고 압축한다.

4. 압축된 파일을 배포하면 됨...

<설치>
Component-Install Packages 메뉴를 통해서 배포된 bpl 파일 추가하면 BCB에 컴포넌트가 추가된다.

PS: 델파이 로 작성된 소스를 BCB의 프로젝트에 포함시켜 사용하지만 델파이 소스는 배포하기 싫은 경우에는 프로젝트에서 델파이 소스는 제외하고 대신 델파이 소스와 관련된 오브젝트파일(.obj) 파일을 프로젝트에 추가한다. 그리고 관련된 파일 hpp, dcu를 같이 배포한다.

Posted by Gu Youn
,
설명 : EnumFonts와 EnumFontsProc(Callback function)을 이용한다. FilFontComboBox() 함수를 호출하면 각 Font에 대해서 Callback 함수가 호출이 되고 ComboBox에 추가 된다.

소스 :
TCombobox* FontComboBox;

int __stdcall EnumFontsProc(TLogFont& logfont,TTextMetric& textmetric,
  DWORD fonttype,TComboBox* data)
{
  dynamic_cast<TComboBox *>(data)->Items->Add(logfont.lfFaceName);
  return 1;
}
void __fastcall FillFontComboBox()
{
  HDC dc;
  dc = GetDC(0);
  EnumFonts(dc, NULL, (FONTENUMPROC)EnumFontsProc,(long)FontComboBox);
  ReleaseDC(0, dc);

  FontComboBox->Sorted = true;
}
Posted by Gu Youn
,
BCB에 새로운 버전의 Indy를 설치할 때는 BCB에 기본으로 포함된 Indy관련 파일을 모두 지우고 설치를 한다.  

Indy 10 설치했다가 안돼서 다시 Indy 9로 바꿨는데...
Indy에 있는 대부분의 컴포넌트는 정상적으로 동작하는데 이상하게 TCPServer를 테스트 하려고 폼에 하나 놓고 Execute이벤트 핸들러 내에서 클라이언트가 입력한 메시지를 읽으려고 하면 AThread->Connection이 NULL이여서 Access Violation이 발생한다.

왜 Connection이 NULL로 넘어오는지 이유는 못 찾고 괜히 Indy 컴포넌트만 지우고 설치하고 만 반복해도 해결이 안되서 혹시나 하는 생각에 빌더 디렉토리에서 indy로 시작되는 파일을 검색해봤더니 빌더에 기본으로 포함된 예전 Indy 파일들이 남아있었다.

빌더 인스톨 할 때 Indy는 선택 안했기때문에 BCB에 포함된 Indy 때문에 이상이 있을거라는 생각은 안했는데 이렇게 많이 남아 있다니 ㅠ.ㅠ. 검색된 파일 이름 뒤에 언더바를 붙이고(or 삭제하고) 새로운 버전의 Indy를 설치하니 모두다 정상적으로 동작한다.

사용자 삽입 이미지















Posted by Gu Youn
,

Indy 10 설치 하기 결론...
Indy 10 디자인 타임 패키지 까지 등록은 됐으나 실제 사용할 때 IdWinSock2.hpp의 TWSAProtocol_INFOW
 타입의 문제로 사용할 수 없다. BCB에서는 Indy 9.x 버전을 사용하자.

다른 분들은 나처럼 시간 낭비 하지 마시라고 Indy 10 설치 내용과 오류발생 이유를 아래에 적는다.

-------------------------------------------------------------------------------

10.1.11 버전에서는 디렉토리가 system, core, supercore, protocols 로 나뉘어져 있다.
설치 순서는 Systme->Core->Protocols 순서로 하며, 디자인 타임 패키지는 Core, Protocols만 등록하면 된다. SuperCore는 Delphi7에서만 사용함으로 설치하지 않는다.

Indy 10에는 dpk파일만 포함이 되어 있다. 볼랜드 포럼의 자료실에서 dpk2bpk(http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_res&no=287)를 받아서 설치를 시작하기 전에 Core, System. Protocols에 있는 dpk파일을 bpk로 바꿔서 사용을 한다. 이 포스르를 작성할 떄는 Delph 7용 dpk를 바꿔서 사용했다.

패키지를 컴파일 하기 전에 Tools->Environment Options->Library path에 core, protocols, system 디렉토리를 추가한다.  이렇게 추가를 해도 패키지 컴파일 할 때 유닛을  못 찾아서 컴파일 에러가 나는 경우가 있었는데 각 패키지의 옵션에 있는 Libray Path에 다시 core, protocols, systme 디렉토리를 추가하면 된다.

Core 디자인 타임 패키지 등록 할 때 IdCoreDsnRegister 유닛에서 DesignIntf 유닛을 못 찾아서 컴파일 에러가 나는데 이때는 패키지의 옵션에 있는 Library Path에 {$CBB}\source\toolsapi 를 추가해주면 컴파일이 된다.

 <에러나는 부분>
    {$IFDEF VCL6ORABOVE}
      DesignIntf,
      DesignEditors;
    {$ELSE}


# 인디 의 설치 순서에 관한내용으로 인디 사이트에서 가져왔다. (전체 내용은 http://docs.projectindy.org/online/frames.html?frmname=topic&frmfile=index.html

에서 볼수 있다.)

Delphi and C++ Builder Installation
Installing Indy.Sockets in a Borland IDE involves using the run-time and design-time packages files to compile the source code in the library. After compiling the packages and source code, design-time packages are installed in the IDE to make the components available on the component palette.

For Delphi and C++ Builder, the run-time package files should be opened and compiled in the following order:

  • IndySystem (in LibSystem)
  • IndyCore (in LibCore)
  • IndyProtocols (in LibProtocols)
  • IndySuperCore (in LibSuperCore) (for Delphi 7 onl��y)

For Delphi and C++ Builder, the design-time package files should be opened, compiled, and installed in the following order:

  • dclIndyCore (in LibCore)
  • dclIndyProtocols (in LibProtocols)
  • dclSuperCore (in LibSuperCore) (for Delphi 7 onl��y)
 

 런타임, 디자인 타임 패키지를 설치 하고 나서 이젠 BCB에서 Indy 10을 사용할 수 있다는 기대감에 기본 프로젝트 만들고 프로젝트 옵션의 Include , Library Path에 설치된 Indy 관련 디렉토리(system, core, protocols)를 추가했다. 그리고 IdTCPServer 하나 놓고 컴파일을 했더니 아래와 같은 에러가 ㅠ.ㅠ

[C++ Error] IdWinSock2.hpp(373): E2257 , expected
typedef  TWSAProtocol_INFOW *LPWSAProtocol_InfoW;

[C++ Error] IdWinSock2.hpp(746): E2303 Type name expected
typedef int __stdcall (*TWSAEnumProtocolsAProc)(System::PInteger lpiProtocols, PWSAProtocol_InfoA lpProtocolBuffer, unsigned &lpdwBufferLength);

[C++ Error] IdWinSock2.hpp(748): E2303 Type name expected
typedef int __stdcall (*TWSAEnumProtocolsWProc)(System::PInteger lpiProtocols, PWSAProtocol_InfoW lpProtocolBuffer, unsigned &lpdwBufferLength);

[C++ Error] IdWinSock2.hpp(750): E2303 Type name expected
typedef int __stdcall (*TWSAEnumProtocolsProc)(System::PInteger lpiProtocols, PWSAProtocol_InfoA lpProtocolBuffer, unsigned &lpdwBufferLength);

[C++ Error] IdWinSock2.hpp(764): E2303 Type name expected
typedef int __stdcall (*TWSADuplicateSocketAProc)(const int s, const unsigned dwProcessId, PWSAProtocol_InfoA lpProtocolInfo);

[C++ Error] IdWinSock2.hpp(766): E2303 Type name expected
typedef int __stdcall (*TWSADuplicateSocketWProc)(const int s, const unsigned dwProcessId, PWSAProtocol_InfoW lpProtocolInfo);

구글을 찾아보니 Indy 10이 BCB에서 호환 되지 않는 이유중 하나가 IdWinSock2.pas 때문이고 아직 해결책은 없다고 한다.

IdWinSock2.hpp와 IdWinSock2.pas를 비교해 보면 IdWinSock2.pas에는 TWSAProtocol_INFOW이 record로 선언되어 있는데 IdWinSock2.hpp에는 struct 선언이 없어서 컴파일 에러가 나는것 같다.

IdWinSock2.hpp에 TWSAProtocol_INFOW 구조체를 추가해서 다시 테스트 해볼 생각도 했는데...그렇게 할 시간이 없어서 당분간 Indy 10 사용하는 것은 포기...

Posted by Gu Youn
,

BCB - StrToHex 함수

Computer/C++ 2005. 11. 6. 14:00
설명: StrToInt함수를 사용하여 문자열을 16진수로 계산하여 정수를 반환한다.

일반 숫자를 나타내는 문자열 앞에 16진수를 나타내는 "0x"를 붙이고 StrToInt함수를 사용한다.

StrToInt 함수 설명(SysUtils에 포함 됨)
인자로 주어진 문자열이 단순 숫자 형태면 십진수 표현으로 보고 문자열을 정수로 변경하지만 문자열에 16진수 표현인 "0x"가 붙어 있으면 16진수 표현으로 보고 문자열이 나타내는 값을 16진수로 계산해서 정수로 변환해준다.

소스:
int StrToHex(String AValue)
{
  String HexFormat = "0x" + AValue;
  return StrToInt(HexFormat);
}

실행결과:
String HexStr = "A0";
StrToHex(HexStr); //160을 반환한다.

Posted by Gu Youn
,