2009-11-17 4 views
5

this question 이후에 다른 버전의 Delphi와 호환되는 DLL에서 클래스의 캡슐화를 수행하려면 어떤 원칙을 따라야하는지 알아야합니다. RAD2010에서 제네릭 기능을 사용하여 클래스를 만들고 인스턴스를 반환하는 함수가있는 DLL을 만듭니다. BDS2006 또는 Delphi 6을 사용하여 DLL을 사용하려고 시도했지만 DLL이 예상대로 작동하지 않았습니다. 그러나 다른 컴퓨터에서 RAD2010을 사용하면 아무런 문제가 없습니다. 그것은 이전 델파이 버전 (스택 <> 거즈?)에서 사용할 수없는 기능을 사용하여 발생합니까? 문자열 문제에 대해서는 이미 라이브러리 파일의 주석 지침을 따르므로 라이브러리의 첫 번째 용도 절과 내 프로젝트에 ShareMem을 넣습니다. 그리고 RAD2010의 borlndmm.dll을 BDS2006을 사용하여 DLL을 시도한 동일한 폴더로 복사했습니다. 충돌을 일으키지는 않았지만 예상대로 작동하지 않았습니다. 함수는 RAD2010 환경에서 매우 잘 작동 할 때 빈 문자열을 반환합니다.델파이를 사용하여 DLL을 만들려면 어떤 원칙을 따라야합니까? 다른 델파이 버전에서도 잘 작동합니까?

다시 한 번 질문 드리겠습니다. 다른 버전의 Delphi와 호환되는 DLL에서 클래스의 캡슐화를 만들기 위해 어떤 원칙을 따라야합니까? 미리 감사드립니다. (OOP가 사용되지 않을 때 dll에 함수를 캡슐화하기 위해 다른 버전의 Delphi는 발행하지 않았습니다.)

답변

8

문자열 정의가 D2009로 변경되었습니다. 문자열 통신을 안전하게하려면 PAnsiChar 또는 WideString을 사용하십시오.

DLL을 통한 통신의 기본 규칙은 델파이에만 해당하는 것을 사용하지 않기 때문에 델파이 문자열이 아니며 TObject 자손도 없습니다. 인터페이스, 레코드 및 COM 형식은 제대로 작동합니다.

+4

나는 두 번째 단락을 강하게 강조하고 싶습니다. Windows API에 공개 된 기능이 보이지 않으면 자신의 DLL에이 기능을 드러내지 마십시오. C, 심지어 이전에는 보지 못했던 환경에서 DLL을 사용한다고 가정하십시오. –

+2

+1. 인터페이스 메소드 매개 변수와 함수 결과에 델파이 특정 유형이 없어야하고 (또한) 필 요한 부분도 아니어야 함을 지적하는 것도 가치가 있습니다. – mghie

+1

+1. 아마도 비 관련이지만, 델파이가 아닌 다른 언어로 그들을 소비하려는 경우 모든 (비 COM) DLL 내보내기를 stdcall로 선언하는 것을 잊지 마십시오. –

2

당신은 질문 : 델파이의 다른 버전에 호환되는 DLL에서 클래스의 캡슐화를 만들기 위해 어떤 원칙을 따라야한다 :

다시 한번 질문이?

다음 중 하나만 있습니다.하지 마십시오. 할 수 없습니다. DLL을 작성한 다음 클래스에서 배제되는 DLL에서 안전하게 사용할 수있는 관용구 및 데이터 형식을 사용하십시오.

또는 BPL을 작성하면 안전하게 클래스를 내보내고 문자열 등을 사용할 수 있지만 동일한 Delphi 버전에 묶여 있습니다. 이 제한은 기술적 인 특성이므로 DLL을 작성하면 이 아닌이 작동합니다. 이를 극복하는 트릭이있을 수 있으며 작동하도록 동일한 클래스 레이아웃을 사용하는 다른 Delphi 버전이있을 수 있지만 이러한 구현 세부 사항에 공용 DLL 인터페이스를 연결하면 안됩니다.

2

기본 유형 만있는 스틱. 인터페이스를 사용하는 경우 유형 라이브러리 편집기를 사용하여 인터페이스를 작성하십시오. 그러면 처음부터 호환 가능한 유형으로 제한됩니다. 좋은 경험 법칙은 Windows API를보고 호출 규칙을 모방하려고 시도하는 것입니다.

DLL에서 클래스를 사용할 수 있습니다. DLL을 클래스로 사용할 수는 없습니다. DLL에서 잘 작동하는 좋은 관용구는 핸들 개념입니다. DLL은 객체를 만들고 그 객체에 대한 핸들을 반환합니다. 해당 개체를 사용하여 다시 작업해야 할 경우 DLL에 함수를 전달합니다. DLL이 객체의 메모리와 수명을 완전히 책임 져야한다는 것을 기억하십시오. DLL 함수를 만드는 간단한 프로세스로 액세스 할 필요가있는 클래스 조각을 노출합니다.

Delphi 측에서 사용자로부터 핸들을 숨기는 프록시 래퍼를 작성할 수 있습니다. 이벤트의 경우 콜백 메소드를 사용할 수 있습니다.기본적으로 비 객체 함수 포인터를 dll에 전달하고 dll은 이벤트에 대한 함수를 호출합니다. 이 과정에 대한 간략한 개요는 Delphi 3000에서 확인할 수 있습니다.

+0

확인 됨. 고맙습니다. – WishKnew

관련 문제