김용유 닷컴

AnsiString 메소드 정리

* AnsiCompare
현재 문자열과 파라미터로 지정한 문자열의 크기를 비교하여 결과를 되돌려 줍니다.
이때 파라미터로 지정된 문자열은 AnsiString 문자열과 비교하여 AnsiString 문자열보다 크면 0보다 큰수를 반환하고, 작을경우에는 0보다 작은수를 , 같으면 0을 반환합니다.
원형
 int __fastcall AnsiCompare(const AnsiString & rhs) const;

Ex 
AnsiString strCompare = "AAA";
int nReturn;
nReturn = strCompare.AnsiCompare("BBB");
if (nReturn > 0) ShowMessage("값이 큽니다.\n");
else if (nReturn > 0) ShowMessage("값이 작습니다.\n");
else  ShowMessage("값이 같습니다.\n");      

Result
값이 작습니다.


...............

[참고] http://bcbjournal.org/articles/vol1/9708/An_AnsiString_class_reference.htm
아래 부분 참고...

더보기


COMMENT 0

    Visual C++ DLL과의 문제점

    실제 세계에서는 Visual C++에서 만든 DLL을 호출하는 일이나 C++Builder에서 만든 DLL을 호출하는 것이나 비슷합니다. 불행하게도, Inprise와 Microsoft는 여러 가지 면에서 다르게 DLL을 구현하였습니다. 처음에 시작할 때 Inprise와 Microsoft는 OBJ에 대한 파일 포맷과 임포트 라이브러리 파일에 대한 포맷을 달리 하였습니다.Visual C++은 COFF 라이브러리를 사용하는 반면 Inprise는 OMF를 사용합니다.  이것이 의미하는 바는 C++Builder 프로젝트에 마이크로소프트에서 생성된 임포트 라이브러리를 추가할 수 없다는 것을 의미합니다.
    다행스럽게도 Inprise는 IMPLIB 라는 유틸리티를 제공함으로써 포맷 형식이 다른 것을 극복할 수 있게 되었습니다.

    2가지 제품 역시 링커 네이밍 규칙도 다릅니다. 이 현상은 C++Builder로부터 Visual C++ DLL을 호출할 때 가장 많이 나타나는 현상입니다.
    DLL이나 OBJ 안에 모든 함수는 링커 이름을 가지고 있습니다. 이 링커는 컴파일 시 프로토타입화된 함수들을 해석할 수 있는 링커 이름들을 사용합니다. 이 링커는 프로그램에 의해 필요하다고 생각되는 링커 이름을 가진 함수를 찾지 못한다면 "unresolved external error"를 발생시키게 됩니다.

    Visual C++ 와 C++Builder 의 네이밍 규칙

    호출 규칙 VC++ VC++ (DEF) C++Builder
    __stdcall _MyFunction@4 MyFunction MyFunction
    __cdecl MyFunction MyFunction _MyFunction

    경우 1: DLL이 오직 __stdcall 함수들만 포함하고 있고 DLL 벤더가 DEF 파일을 사용할 경우.

    IMPLIB는 다음과 같이 사용합니다:

      IMPLIB (목적 lib 이름) (소스 dll)
    예를 들면,
      IMPLIB mydll.lib mydll.dll
    그리고 프로젝트에 바로 mydll.lib를 첨가하기만 하면 됩니다.

    경우 2: DLL이 __cdecl 함수를 포함하고 있거나 장식된 이름의 __stdcall 함수를 사용하는 경우.

    이 경우 IMPDEF 유틸리티를 다음과 같이 사용하여 DEF 파일을 만듭니다:

      IMPDEF (목적 DEF 파일) (소스 DLL 파일).
    예를 들면,
      IMPDEF mydll.def mydll.dll
    IMPDEF를 실행시킨 후에, DEF 파일을 열어봅니다. Visual C++로 컴파일된 DLL일 경우 위의 명령어로 생성되는 DEF파일의 형태는 다음과 같을 것입니다:
      LIBRARY   DLL.DLL

      EXPORTS

        CdeclFunction       @1
        UnknownFunction     @3
        _StdCallFunction@4  =_StdCallFunction      @2
    다음 단계는 C++Builder가 인식할 수 있는 DLL 함수 이름으로 알리아스를 변경하는 일입니다. 다음의 예가 이 DEF 파일을 적절히 변경한 예입니다.
      EXPORTS
        알리아스 타입 변경
        (Borland 이름)= (Visual C++에 의해 노출되는 이름)
        _CdeclFunction  = CdeclFunction
        _UnknownFunction = UnknownFunction
        StdCallFunction = _StdCallFunction@4
    마지막 단계는 알리아스화된 DEF 파일로부터 알리아스화된 임포트 라이브러리를 만드는 일입니다. 다음의 형태를 따라야 합니다. 이 경우 DLL을 사용하는 것이 아니라 DEF 파일을 사용한다는 점에 주의합시다.
      IMPLIB (목적 lib 파일) (소스 def 파일)
    예를 들면,
      IMPLIB mydll.lib mydll.def
    임포트 라이브러리가 생성되었다면 mydll.lib를 첨가하면 됩니다.

    2)DLL이 싫으면, 아예 OCX로 구현하면 됩니다. 이렇게 하면 Delphi와 C++Builder에서 구현할 수 있습니다. 

    볼포에서 발췌...

COMMENT 1

DLL을 작성하다 보면 DLL을 호출하는 부분이 누구인지 궁금할 때가 있다.
이럴때 DllMain 부분을 다음과 같이 작성하면 누가 호출하는지 알수가 있다..
VCL과 MFC에서 사용하는 방법이 조금 다르다... 다음은 MFC에서 사용하는 방법으로 작성하여 본 것이다..

VCL에서는 호출하는 정의가 조금 다르다.. 그래서.. DLL_PROCESS_ATTACH 부분이 조금 다르다...

VCL : int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
MFC : BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fwdreason, LPVOID lpvReserved)





아래는 참고 내용이다..

DllMain

더보기


COMMENT 0

LL 을 만들때 Import 헤더와 Export 헤더가 다르게 나올수 있다..

이럴때.. 헤더 파일에 다음과 같이 지시자를 만들면 조금 하나의 헤더파일만 작성하면 다른 헤더파일을 만들 필요가 없다..

#ifdef __DLL__
#define DLL_FUNC __declspec(dllexport)
#else
#define DLL_FUNC __declspec(dllimport)
#endif

그리고 전체 헤더에 전역으로 처리하고자 할때에도 다음과 같은 부분을 만들고 그 사이에 헤더 파일을 작성하면 범위 안의 함수들은 같은 전역으로 처리가 가능하다..

#ifdef __cplusplus
extern "C"{
#endif
.... 내용......
#ifdef __cplusplus
}
#endif

다음은 위의 방법으로 만들어본 헤더 파일이다...

COMMENT 0

볼프에서 발췌....

코드기어 라이선스 등록횟수 초과시에 아주 유용한 사이트

http://reg.codegear.com/bump

직접 등록시
https://reg.codegear.com/srs6/activation.do

http://reg.codegear.com 에서는 이 두가지 정보를 조합해서 특정 시리얼 넘버를 소유한 사람이 특정 PC에서만 적용이 가능한 activation 파일을 만들어내고, 델파이/C++빌더가 실행될 때 activation 파일이 발견되면 내부적으로 라이선스 인증 처리를 합니다.

그래서 activation 파일을 받는 방식으로 등록을 하려면 당연히 Registrarion Code가 필요한데, 델파이/C++빌더 2007 버전의 경우, 설치후 첫번째 실행시에 나타나는 등록 마법사(Registration Wizard)에서 Registrarion Code가 나타나지 않습니다. 이건 2007 버전의 등록 마법사의 버그라고 생각되는데요. (다른 버전들에서는 모두 이상없이 나타납니다)

편법이지만, 다음과 같은 방법으로 2007 버전의 등록 마법사에서 필요한 Registrarion Code를 알아낼 수 있습니다.
제품을 먼저 설치하고 실행하려고 시도하면 아시다시피 등록 마법사가 나타납니다. 이때 Serial number 와 user name을 넣으세요. 그런 후 바로 Cancel 버튼을 클릭하여 취소하고 나갑니다.

그런 후 사용자 계정 홈 디렉토리(XP의 경우 C:\Documents and Settings\<user name>\)에 보시면 sanct.log 파일이 생성되어 있습니다. 이 파일을 열어보시면 윗부분에 Registration Key: 라고 해서 써있습니다. 이것이 Registration Code입니다.

COMMENT 0

빌더에서 가끔 보면 디자인 패키지에는 컴포넌트가 있으나 디자인 팔레트가 나타나지 않을 경우가 있다.
이럴때 사용하고자 할때에는

.cpp에 추가할 내용
#pragma link "사용할_OCX"

.h에 추가할 내용
#include "사용할_OCX.h"

를 하고 해당 컴포넌트를 사용하면 사용 가능함..

COMMENT 0

[원문주소] http://cbuilder.borlandforum.com/impboard/impboard.dll/trackback?sn=97053
http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_faq&no=108
Delphi 로 된 Component 를 설치하다 보면 Dsgnintf.dcu 또는 Designintf.dcu 를 찾을 수 없다는
에러 메시지를 보게 됩니다. 이 에러 메시지가 나는 이유는 무엇일까요?

Component 에는 Design Time 에서 사용하기 쉽도록 Component Editor, Property Editor 가
포함되어 있는 경우가 있습니다. Delphi 에서 Design Time 에 필요한 Component Editor, Property Editor 를
사용하기 위해서는 uses 부분에 Designintf 또는 Dsgnintf 를 사용해야 합니다. 어떤 것을 사용할지는
Delphi 버전에 따라 다르겠지요. Delphi 6 이후부터는 Designintf 를 사용합니다.

C++Builder 에서 사용할 경우 약간 까다로운 문제가 발생합니다.
C++Builder 에는 Delphi Compiler 인 dcc32.exe 와 C++ Compiler 인 bcc32.exe 가 공존합니다.
따라서 패키지 파일인 bpk 파일에 두개의 컴파일러를 위한 옵션이 따로 있습니다.

bpk 를 텍스트 에디터로 열어서 그 내용을 보면 다음과 같은 항목이 있습니다.

<CFLAG1 value="-Od -H=$(BCB)\lib\vcl60.csm -Hc -Vx -Ve -X- -r- -a8 -b- -k -y -v -vi- -c
      -tWM"/>
<PFLAGS value="-$YD -$W -$O- -$A8 -v -JPHNE -M"/>


CFLAG1 은 C++ Compiler 인 bcc32.exe 를 위한 옵션입니다.
PFLAGS 는 Delphi Compiler 인 dcc32.exe 를 위한 옵션입니다.

Component 를 C++Builder 로 만들었다면 PACKAGES value 값에 designide.bpi 가 포함됩니다.
<PACKAGES value="rtl.bpi ApLabel_bcb6.bpi designide.bpi vcl.bpi vcljpg.bpi"/>


Delphi 로 Component 를 만들었다면 문제가 발생합니다. Delphi Compiler 인 dcc32.exe 에
designide 패키지를 사용하겠다는 것을 알려주어야 됩니다. 그런데 얄밉게도 Builder 가 알아서
처리하지 못합니다. 따라서 사용자가 수동으로 처리를 해주어야 합니다.

dcc32.exe 의 옵션을 보면 -LU 라는 옵션이 있습니다. 패키지를 사용하겠다는 것을 알려주는
옵션입니다. 이 옵션을 사용자가 수동으로 지정해 줍니다. 다음과 같이 말입니다.

<PFLAGS value="-$YD -$W -$O- -$A8 -v -JPHNE -M -LUDesignIde"/>

COMMENT 0

이 에러는 디버거 모듈이 로드 되지 않았을때 나온다.. 업데이트 하다가 많이 발생했다..

이럴때는 이 모듈을 다시 등록해주면 된다..

regsvr32 bordbk105.dll
regsvr32 bordbk105n.dll


COMMENT 0

Open Dialog나 Save Dialog 사용시 보통 실행 시키면 화면 중앙에 위치하게 된다.

그런데, 원하는 특정 위치로 보내야할때가 있다..

이럴때는 해당 다이얼로그의 OnFolderChange의 이벤트에 다음과 같이 작성한다.

COMMENT 0

 
요약: When trying to creating a simple C++ designtime package that might refer to ‘DesignIntf’,’DesignEditors, the Delphi compiler complains that 'DesignIntf.dcu' and 'Proxies.dcu'cannot be found.

When trying to compile a C++ package that refers to DesignIntf, DesignEditors in say, a pascal unit you might see errors as follows:

[DCC Error] XXXX.pas(X): F1026 File not found: 'DesignIntf.dcu'


Or if you add the DesignEditors.pas location to the project’s "search path", the error is:

[DCC Error] DesignEditors.pas(609): F1026 File not found:'Proxies.dcu'

This issue is documented in readme for BDS2006. This is the note from BDS 2006's readme file:

 

C++ Notes
If you are creating a C++ Package that contains a Delphi unit thatuses the DesignIntf and DesignEditors tools, you must choose Project|Options|Pascal Compiler|Other Options and then add
"-LUDesignIDE" for the compiler to work correctly.

So in CB2007/RAD Studio 2007, all you need to do is:

Project|Options|Pascal Compiler|Other Options|"Use these packages when
compiling", then add "DesignIDE" in the combobox. 

Author: Roy Nelson

'S/W 개발 > Embarcadero' 카테고리의 다른 글

OpenDialog 화면 위치 재정의 하기  (0) 2008.11.11
DesignIntf.dcu and Proxies.dcu not found.  (0) 2008.10.14
디렉토리를 한번에 생성하는 방법  (0) 2008.09.29
LoadLibraryEx  (0) 2008.03.20

COMMENT 0

티스토리 툴바