귀하는 손님 이십니다
로그인
회원가입
  
  델마당 공식 은행계좌
  하나은행 227-910235-83607
  예금주 이상국(운영진)
프로젝트 게시판
투표게시판
델마당소개
기초부터 활용까지! 델파이 교육 - 데브기어
 광고문의 :
강좌, 팁, 정보 강좌, 팁, 정보 입니다.
글내용 - 강좌, 팁, 정보
 델파이에서 VC DLL CString 사용
coding
(권순호)
2018-09-28 오후 1:09:58
카테고리: 팁
1558회 조회



등록된 파일이 없습니다.
다음과 같이 CString을 사용하는 VC++ DLL 이 있을 때
델파이 쪽에서 CString 참조하는 방법을 적어 본다.

// VC++ 2017에서 CString은 template으로 구현되어 있다.
#include "stdafx.h"
#include <atlstr.h>

CString s;

extern "C" {
    __declspec(dllexport) CString& GetCString()  // exported function
    {
        s = L"From VC CString";
        return s;  // return CString reference
    }
}


델파이 쪽에서 레퍼런스로 리턴되는 CString을 사용하기 위해선

// rad 10.2.3 

implementation

type
  PCString = ^CString;
  CString = record end; // class가 아닌 record로 한 것은 델파이에선 모든 클래스가
                        // Implicit로 TObject를 상속하기 때문에 불필요 하게 VMT
                        // 테이블이 사용되기 때문.

function GetCString(): PCString; cdecl; external 'test.dll' name 'GetCString';

type
  stringEx = record helper for string
    class function vc<T>(const V: T): string; static;
  end;

class function stringEx.vc<T>(const V:T): string;
begin
  Result := PChar(PDword(PDword(@V)^)^);
end;

// s 나 Caption엔 "From VC CString"이 출력 될 것임. 
procedure TForm1.Button1Click(Sender: TObject);
var s: string;
begin
   // instance로 호출 할 수도 있고
   s := s.vc(GetCString());
   // 다음과 같이 호출 할 수도
   Caption := string.vc(GetCString());
end;


반대로 VC++ 쪽에서 델파이 다이나믹 어레이나 string, TForm 클래스 등을 액세스하는 것은 
template 이용해서 더 쉽고 간략하게 할 수 있다. 응용은 스스로. ㅋㅋ