자유롭게 질의 및 응답을 할 수 있는 게시판입니다. 개발자 여러분의 답변이 큰 도움이 됩니다. 
- 제품설치/등록 오류 문의: 설치/등록 Q&A 이용 (제품 구매 고객 한정)
 
		
	
	
		
			Delphi			Visual Studio C++  DLL 사용 시 CString 처리는...
		
		
			2015.04.20 20:02		
		
	
	
	
		
	
	
				C++로 작성 된 DLL 파일을 델파이에서 사용하려는데
DLL에 다른 함수들은 문제가 없는데 CString 인자가 있는
아래 함수 중 InitKernel 가 제대로 되지 않습니다. 델파이에서 어떻게
변환 사용 가능 한지요?
############################################################################
Visual Studio C++로 작성된 코드에서는 정상 작동 됩니다.
 
   CString eni_xml = _T("text.xml");
   InitKernel(eni_xml, slaves);
   OnlineMode(2);
   Stop();
   위 InitKernel의 헤더 파일에 아래로 정의되어 있고요
   extern "C" TEST_API int InitKernel(IN CString &ENIXML,OUT int &Node);
   extern "C" TEST_API int OnlineMode(IN int Mode);
   extern "C" TEST_API int Stop();
############################################################################
Delphi 에서는 함수 호출은 모두 정상적으로 되나 문제는 InitKernel 함수에서
C++에서 정의된 CString eni_xml 을 Delphi에서는 어뗗게 저의 하여야 하나요?
eni_xml을 PChar로도 해보고, 여러가지 해 봤는데 잘 안되네요.
   eni_xml := 'text.xml';             //  PChar 형등 여러가지.            
   InitKernel( eni_xml, slaves);
   OnlineMode(2);
   Stop();
   위 C++을 아래로 정의하고,
   function InitKernel( ENIXML: PChar; Node:Integer):Integer;stdcall;external DLL_NAME name 'InitKernel';
   function SetOnlineMode(Mode:Integer):Integer;stdcall;external DLL_NAME name 'OnlineMode';
   function Stop();stdcall;external DLL_NAME name 'Stop';
############################################################################
			
	
	
	
	
	
	
Delphi Visual Studio C++ DLL 사용 시 CString 처리는...
2015.04.20 20:02
C++로 작성 된 DLL 파일을 델파이에서 사용하려는데
DLL에 다른 함수들은 문제가 없는데 CString 인자가 있는
아래 함수 중 InitKernel 가 제대로 되지 않습니다. 델파이에서 어떻게
변환 사용 가능 한지요?
############################################################################
Visual Studio C++로 작성된 코드에서는 정상 작동 됩니다.
 
   CString eni_xml = _T("text.xml");
   InitKernel(eni_xml, slaves);
   OnlineMode(2);
   Stop();
   위 InitKernel의 헤더 파일에 아래로 정의되어 있고요
   extern "C" TEST_API int InitKernel(IN CString &ENIXML,OUT int &Node);
   extern "C" TEST_API int OnlineMode(IN int Mode);
   extern "C" TEST_API int Stop();
############################################################################
Delphi 에서는 함수 호출은 모두 정상적으로 되나 문제는 InitKernel 함수에서
C++에서 정의된 CString eni_xml 을 Delphi에서는 어뗗게 저의 하여야 하나요?
eni_xml을 PChar로도 해보고, 여러가지 해 봤는데 잘 안되네요.
eni_xml := 'text.xml'; // PChar 형등 여러가지.
   InitKernel( eni_xml, slaves);
   OnlineMode(2);
   Stop();
   위 C++을 아래로 정의하고,
   function InitKernel( ENIXML: PChar; Node:Integer):Integer;stdcall;external DLL_NAME name 'InitKernel';
   function SetOnlineMode(Mode:Integer):Integer;stdcall;external DLL_NAME name 'OnlineMode';
   function Stop();stdcall;external DLL_NAME name 'Stop';
############################################################################
                                            
								
CString은 MFC의 데이터 타입이어서 델파이에서 그대로 사용할 수 없습니다.(반대로 델파이 클래스를 VS에서도 사용할 수 없습니다.)
방법은 중간에 Wrapping DLL을 하나 만들고 표준 문자열 방식인 char *로 변환하면 델파이에서 PChar로 연동할 수 있습니다.