설명 : 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
,

직딩의 뇌구조(퍼옴)

잡담 2005. 11. 22. 23:15

델마당에 누가 올려놨는데 재미 있어서 블로그에 올림.

사용자 삽입 이미지

PS : 그림을 마음대로 올려도 되는지 몰라서 감자도리 가봤더니 상업적인 목적만 아니면 상관 없다고 한다.

'잡담' 카테고리의 다른 글

이사오다.  (2) 2007.12.19
초코파이 문어  (0) 2006.12.20
영화 Man of Honor 를 보고...  (0) 2006.11.18
재미있는 노래. ㅎㅎ  (0) 2006.02.22
대청소  (2) 2006.02.21
우리은행 비밀번호 변경 관련....  (2) 2005.11.06
유무선 공유기 두번째 구입  (2) 2005.10.22
찌꺼기 없는 지우개 만들어 주세요.  (2) 2005.10.16
리눅스 설치하기 포스트 예정.  (4) 2005.09.14
윈도우 미워 ㅠ.ㅠ  (3) 2005.08.25
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
,

몇 년동안 사용하지 않던 우리은행 통장을 사용할 일이 생겼는데...
아무리 생각을 해도 비밀번호가 기억이 나지 않아서 비밀번호 변경하려 가까운 우리은행 지점에 갔더니 통장 개설한 도시개발공사 출장소에 가야 된단다.
아무리 같은 서울이라고 해도 여기서 도시개발공사 있는데 까지 갔다 오려면 최소한 2시 간은 넘게걸리는데 거길 가서 변경하라니...
통장에 돈만 넣어놓고 당분간 돈은 쓰지 말라는 소리와 다를게 없네 ㅠ.ㅠ
비밀번호 변경하는 것은 포기하고 통장을 그냥 해지하고 다시 만들기로 했는데...
나는 통장 잔고가 50만원 미만이여서 다른 지점에서 해지가 가능하지만 50만원 이상이면 해지도 안된다고 한다. 만약 서울에서 통장 개설하고 부산으로 이사를 갔는데 잔고가 50만원 이상이고 비밀번호를 잊어버렸다면 비밀번호 변경하러 서울까지 와야 된다는 소리인데 고객의 계좌 안전을 위해서 서울까지 오게 만드는 우리은행 서비스 좋다고 해야하나?

'잡담' 카테고리의 다른 글

초코파이 문어  (0) 2006.12.20
영화 Man of Honor 를 보고...  (0) 2006.11.18
재미있는 노래. ㅎㅎ  (0) 2006.02.22
대청소  (2) 2006.02.21
직딩의 뇌구조(퍼옴)  (0) 2005.11.22
유무선 공유기 두번째 구입  (2) 2005.10.22
찌꺼기 없는 지우개 만들어 주세요.  (2) 2005.10.16
리눅스 설치하기 포스트 예정.  (4) 2005.09.14
윈도우 미워 ㅠ.ㅠ  (3) 2005.08.25
양자택일  (2) 2005.08.14
Posted by Gu Youn
,
UNIX에서 작업하는 경우 가끔 OCI 드라이버가 32bit 용으로 되어 있어서 로드가 안되는 경우가 있었다. 그럴때는 UNIX에 맞는 64비트용 OCI 드라이버가 로드 되도록 환경을 수정하면 된다.

시스템에서 라이브러리가 로드되는지는 아래 코드를 이용해 확인한다.
try
{
  System.loadLibrary("ocijdbc9");
}
catch(Exception e)
{
  out.println("loadLibrary Error");
  out.println(e.getMessage());
  System.exit(-1);
}

--------------------------------------------------------------------------------
OCI 관련 참고 자료 [자바서비스넷 에서 퍼옮]

Oracle OCI Driver와 Thin Driver  

Sun에서는 각 Vender들(Oracle, informix, sybase,etc..)에게 4가지 종류의
JDBC Driver가 있음을 공표 했습니다.
그 중에서도 Type 2와 Type 4형태의 Driver를 Vender들이 많이들 제공하는데,
Type 2 JDBC Driver란, Oracle로 얘기하면 Sql*Net을 필요로 하며, .dll혹은
.so형태의 H/W 종속적인 형태의 Native Module을 통해 DB와 연결됩니다.
Oracle의 경우 JDBC Type 2 형태를 통상 OCI(Oracle Call Interface) Driver라
부릅니다.


반면 Type 4 형태의 JDBC Driver는 순수하게 Java package만으로 바로 DB와
연결이 가능합니다. Oracle에서는 통상 thin Driver가 부릅니다.

Type 2형태가 보다 빠른 성능을 냅니다. 반면, SQL*Net(Oracle의 경우) 과 같은
native module이 항상 있어야 하므로 물리적인 H/W구성에 다소 종속적인 형태가
될 수 밖에 없습니다.

반면 Type 4의 형태일 경우는 Client에서 필요로 하는 것은 유일하게 Java클래스
들만으로 DB와 접속이 가능하니 어떤 H/W, OS에서도 유연하게 DB연결이 가능
합니다. 대신 OCI 형태보다 성능이 떨어진다고 합니다.

그러나 이건 어디까지나 Oracle JDBC Driver에 한해서 그러할 뿐, 다른 DB
Vendor는 특정 Type의 JDBC Driver만 제공하기도 합니다.


Oracle의 경우, OCI Driver와 thin Driver를 사용하는 방법은 다음과 같습니다.

OCI Driver:
     libjdbc*.so 파일이 필요하며, 해당 디렉토리가 Shared Library Path에 등록되어
     있어야 합니다. 즉, 최소한 Oracle Client 제품이 머신에 설치되어 있어야 합니다.
     자세한 사항은 다음의 문서를 참조하세요.
     http://javaservice.net/~java/bbs/read.cgi?m=dbms&b=jdbc&c=r_p&n=956117778

     classes111.zip 이 필요합니다.

   [사용법]
     String driver = "oracle.jdbc.driver.OracleDriver";
     String url = "jdbc:oracle:oci8:@ORA8i_alias";
     String user = "scott";  String password = "tiger";
     Class.forName(dirver);
     Java.sql.Connection conn = DriverManager.getConnection(url, user, password);

    NOTE: $ORACLE_HOME/network/admin/tnsnames.ora 파일에 해당 alias가 등록되어
          있어야 합니다.

Thin Driver:
     classes111.zip 이 필요합니다. thin 방식의 경우는 이 파일만 있으면 되며, Oracle관련
     제품이 Local머신에 설치되어 있을 필요가 없습니다.


   [사용법]
     String driver = "oracle.jdbc.driver.OracleDriver";
     String url = "jdbc:oracle:thin:@210.220.251.96:1521:ORA8i";
     String user = "scott";  String password = "tiger";
     Class.forName(dirver);
     Java.sql.Connection conn = DriverManager.getConnection(url, user, password);
  
   NOTE: thin 방식으로 접속할 경우, 원격지 Oracle DB의" Listener"가 떠 있어야 합니다.
         본게시판의 JDBC FAQ 를 참조하세요

   
NOTE: 프로그램 소스상의 유일한 차이점은 DB URL이 OCI는 Remote DB에 대한 Local Alias를
    사용하는 반면, Thin Driver는 Remote 머신의 IP Address와 Port번호, 그리고
    해당 DB의 SID를 필요로 한다는 것만이 차이가 있을 뿐입니다.

-------------------------------------------------------  
  본 문서는 자유롭게 배포/복사 할 수 있으나 반드시
  이 문서의 저자에 대한 언급을 삭제하시면 안됩니다
================================================
  자바서비스넷 이원영
  E-mail: javaservice@hanmail.net
  PCS:019-310-7324
================================================

각 시스템별 Shared Library PATH 환경변수는 아래와 같습니다.

AIX            LD_LIBRARY_PATH
OS/2           LIBPATH
Windows NT/95  PATH
Solaris        LD_LIBRARY_PATH
Linux          LD_LIBRARY_PATH
HP/UX          SHLIB_PATH


OCI 드라이버는 해당 OS의 shared library를 통해 native module을 사용합니다.
$ORACLE_HOME/lib 디렉토리에 보시면 Oracle 8.0.5의 경우 liboci804jdbc.so
(혹은 *.sl)파일이 있을 겁니다. 이것이 shared library이지요.
Oracle 8.1.5의 경우는 libocijdbc8.so 파일입니다.

결국, '손님'은 이 환경변수가 제대로 잡혀 있지 않아서 발생하는 문제입니다.

LD_LIBRARY_PATH=/usr/lib:/home/oracle/app/oracle/product/815/lib:/usr/java/lib
export LD_LIBRARY_PATH

Linux 에서 Oracle 8.1.5 버전을 사용하는 저의 LD_LIBRARY_PATH를 참고 하세요.

javaservice:/home/java$ uname -a
Linux javaservice.net 2.2.12-20kr #1 Tue Oct 12 16:46:36 KST 1999 i686 unknown
javaservice:/home/java$ env|grep LD_LIB
LD_LIBRARY_PATH=/usr/lib:/home/oracle/app/oracle/product/815/lib:/usr/java/lib
javaservice:/home/java$ env|grep CLASS
CLASSPATH=.:/usr/java/lib/classes.zip:/home/oracle/app/oracle/product/815/\
jdbc/lib/classes111.zip:/home/oracle/app/oracle/product/815/jdbc/lib/\
nls_charset11.zip
javaservice:/home/java$


NOTE: 서블렛 엔진마다 LD_LIBRARY_PATH를 거는 방법이 약간씩 다른긴 합니다만,
      최근엔 대부분, 서블렛엔진을 띄우기 전에 LD_LIBRARY_PATH를 환경변수에
      잡아주거나, Start 시키는 Script 에 첨가해 두는 것이 일반적인 듯 합니다.

Posted by Gu Youn
,