문제

일:

Delphi로 작성된 애플리케이션은 구조(record Delphi의 관점에서) 세 가지 필드가 있습니다.다음을 사용하여 이 구조의 포인터를 보낼 수 있습니다. SendMessage (Win32 API) 기능.

질문은 다음과 같습니다.

델파이 측면에서 델파이의 메모리에서 특정 구조 표현을 유지하는 방법은 무엇입니까?

종류가 있어요

PWPModPostData = ^ TWPModPostData;
TWPModPostData = record
   DataType: Integer;
   Data: PChar;
   Next: PWPModPostData;
end;

C에서는 어떻게 정의하나요?델파이 구조에 숨겨진 필드나 서비스 필드가 있나요?

도움이 되었습니까?

해결책

아니요, 숨겨진 필드는 없으며 델파이 레코드와 C 스트러크는 몇 가지 경고와 함께 서로 1 : 1에 매핑 할 수 있습니다.

  • 데이터 유형 C는 이해하지 못합니다. 여기에는 객체, 동적 배열 및 델파이 문자열이 포함됩니다.

  • C와 Delphi는 때때로 바이트 균형 필드를하는 방법에 대한 다른 아이디어를 가지고 있습니다. 레코드를 테스트하고 C 측에서 작동하는지 확인하십시오. 그렇지 않으면 사용해보십시오 포장 된 기록대신에 기록.

  • C에서 델파이로 또는 그 반대의 레코드에 대한 포인터를 전달할 때, 그것을받는 쪽이 메모리를 자유롭게하거나 재 할당하려고하지 않도록하십시오. 그것은 그것을 만든 메모리 매니저에 속합니다.

다른 팁

이러한 구조의 주소를 다음과 같은 다른 애플리케이션으로 확실히 보낼 수 있다는 점에 유의하십시오. LPARAM ~의 SendMessage() 전화하면 아마도 작동하지 않을 것입니다.그 이유는 동일한 포인터가 자체 주소 범위를 가진 다른 응용 프로그램에서 사용될 때 일반적으로 동일한 물리적 메모리 위치를 가리키지 않기 때문입니다.

다음과 같은 몇 가지 Windows 메시지에 대해 작동합니다. WM_GETTEXT, 이러한 경우 OS는 커튼 뒤에서 필요한 매핑을 수행하므로 수신 애플리케이션은 호출 애플리케이션이 할당한 버퍼에 데이터를 복사할 수 있고 주소는 두 애플리케이션 모두에서 동일한 물리적 메모리 청크를 가리킵니다.

다음을 사용하여 동일한 결과를 얻을 수 있습니다. WM_COPYDATA 메시지는 두 응용 프로그램 간에 데이터를 교환할 때 필요한 메모리 마샬링을 수행하기 위한 것입니다.

그러나 귀하의 질문에 있는 구조에는 메모리에 대한 포인터가 포함되어 있기 때문에 또 다른 문제가 있습니다.그만큼 WM_COPYDATA 문서에서는 이 작업을 수행해서는 안 된다고 명시적으로 명시하고 있습니다.전체 메모리 블록의 주소는 수신 애플리케이션에서 유효하도록 수정되지만 시스템은 메모리 블록의 어느 부분이 포인터인지 알 수 없으며 매핑이 필요합니다.따라서 포함된 모든 포인터는 그대로 유지되며 유효하지 않을 수 있습니다.단일 연결 목록은 깨질 것이며, PChar 요소에도 액세스할 수 없습니다.

편집하다:

귀하의 의견에 관하여:위 사항은 다른 애플리케이션에서 메시지를 보내려는 경우에만 중요합니다.DLL에서 이 작업을 수행하면 DLL이 로드된 프로세스의 주소 공간을 공유하므로 모든 것이 작동합니다. 따라서 응용 프로그램이나 로드된 DLL에서 사용되는 포인터는 항상 동일한 메모리 위치를 가리킵니다.이로 인해 혼란을 겪게 해서 죄송합니다. 하지만 귀하의 질문으로는 데이터 교환이 하나의 응용 프로그램 내에서 발생한다는 것이 명확하지 않았습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top