버전이 달라서 그럴 겁니다.
이미 보셨겠지만, BDS 2006에서는 GetTableNames가 오버로드되어 있어서 이 이름의 함수를 호출하면 두개의 함수
중에 하나가 선택됩니다. 그런데 애플리케이션 쪽에서 ComboBox1->Items를 보내줘서 TStrings임을 확인하기를 기대
하셨겠지만, VCL 5의 TStrings와 VCL 10의 TStrings는 호환이 안된다고 생각하는 것이 정상입니다. (되면 오히려 이상하죠)
어떤 편법을 동원해서 혹시라도 이게 동작을 하더라도, 다른 오동작이나 메모리 오류가 발생할 가능성이 대단히 높습니다.
절대로 피하셔야 합니다. VCL버전이 호환이 안되므로 VCL 클래스 타입이 아닌 기본 타입만 쓸 수 있다고 생각하셔야 하구요.
코드가 좀 더 복잡해지더라도 dll에서 char **를 써서 문자열의 배열 형식으로 변환해서 전달하고, 애플리케이션쪽에서
다시 TStrings로 변환해서 받는 수밖에 없습니다.
그건 그렇고... 회사에서 C++빌더 5 프로페셔널을 쓰신다니 참 난감하시겠네요.
C++빌더와 델파이의 5 프로페셔널은 ADO를 지원하는 5 이상의 버전들 중에서 유일하게 ADO를 지원하지 않습니다.
6 버전에서는 프로에서도 ADO를 지원하거든요. 이런 문제 때문에, 볼랜드에서 5 프로페셔널을 위한 ADO 기능만의
업그레이드 패키지도 판매했었습니다만.. (몇십만원 정도였던걸로 기억합니다) 지금은 5 버전 자체가 단종된지 오래라서
그것도 구하기 어렵겠군요.
그럼...
머슴.한석복 님이 쓰신 글 :
: ADOConnection->GetTableNames(TWideStrings *list, (TStrings *)(dbGetTableList());
: 에서 TWideStrings에 집어 넣을 수 있는 클래스가 어떤 클래스 일까요?
:
: 질문이 뜬금 없긴 한데요.
:
: 제가 지금 하는게,
:
: BDS에서, ADO Component 를 이용해서-> DLL을 만들어서,
: CBuilder 5에서 사용 할려고 하는데요( 5 버젼에서는 Enterprise 이상에서만 ADOComponent가 지원
: 되더라구요. 제거는 professional 버젼이라서...ㅡ.ㅡ)
:
: 분명히 BDS 로 작성한 Application에서는 이코드가
: /////////////////////////////////
: void GetTableList( void *list ){
: TStrings *NameList = (TStrings *)list;
: ADOConnection->GetTableNames(NameList, false);
: }
:
: *[호출하는 코드는, dllGetTableList( ComboBox1->Items );] 이렇게 작성 했구요.
: //////////////////////////////////////////////////////////////////////////////////
: 아무 문제가 되지 않았는데요.
:
: 5 버젼에서는 똑같은 코드가 아래와 같은 에러가 발생 하네요.
: 'Cannot assign a TWideStringList to a TComboBoxStrings'
:
: ( 분명 HELP 에서 FUNCTION PROTOTYPE에는
: Syntax
: [C++] void GetTableNames (TWideStrings * List, bool SystemTables);
: [C++] void GetTableNames (TStrings * List, bool SystemTables);
: 로 되어 있는데 말이죠..)
:
:
: 그래서, 편법으로, DLL Function 내에서, TStringList를 동적으로 생성해서 그것을 return해 주는 방식으로
: 했는데, 이게 무언가가 정상적이지 못한 방법인것 같아서 질문을 드립니다. 혹시, BDS와 Builder5와의 차이로 인한것인지, 그렇다면 어떻게 해결해야 하는지 알고 싶습니다.
:
: 아시는분들 좀 가르쳐 주세요.
|