2008-08-29 4 views
8

간단한 64 비트 메모리 관리를 위해 C++에서 Delphi 호환 dll을 생성하라는 요청을 받았습니다.64bit 메모리 할당

배경은 Delphi의 시스템이 32 비트 주소 지정 가능 공간 밖에서 잘 돌아갈 수있는 많은 양의 메모리를 할당해야한다는 배경입니다. 델파이 개발자는 나에게 그가 사용할 수있는 델파이 명령으로 메모리를 할당 할 수 없다고 설명했습니다. 그는 64 비트 주소를 가질 수 있다고 말하면서, 나는 메모리를 할당하고 그에게 64 비트 포인터를 반환하기 위해 내가 제공하는 함수를 호출하기를 원한다. 그런 다음 나중에 메모리를 확보하는 또 다른 기능.

이제 처 음에 VS 2008 만 있으므로 첫 번째로 델파이 호환 DLL을 만들 수 있는지 잘 모르겠습니다.

모든 델파이 전문가가 나를 도와줍니다. 휠을 다시 발명하지 않고 그가 원하는 것을 성취 할 수있는 방법이 있을지도 모릅니다. Delphi에서 다른 개발자가이 문제를 경험 했어야합니다.

모든 의견이 감사하겠습니다.

+0

32 비트 프로세스에서 수행 할 수 없기 때문에 메모리 블록에 데이터를 읽거나 쓸 수있는 기능이 필요합니다. 32 비트 프로세스는 수행 할 수 없으므로 일반 DLL이 될 수 없습니다. 그것을로드합니다. 기본적으로 EMS/XMS 메모리 "Extender"를 쓸 것을 요청했습니다. –

답변

7

64 비트 프로세스 만 64 비트 메모리를 처리 할 수 ​​있습니다. 64 비트 프로세스는 64 비트 DLL 만로드 할 수 있고 32 비트 프로세스는 32 비트 DLL 만로드 할 수 있습니다. 델파이의 컴파일러는 32 비트 바이너리 만 만들 수 있습니다.

그래서 32 비트 Delphi exe는 64 비트 C++ dll을로드 할 수 없습니다. 32 비트 C++ dll을로드 할 수는 있지만 그 dll은 64 비트 메모리 공간을 처리 할 수 ​​없습니다. 당신은이 솔루션에 매달려 있습니다.

델파이는 올바른 컴파일러 옵션과 Windows 스위치가 문제없이 3GB의 메모리를 처리 할 수 ​​있습니다. Physical Address Extension을 사용하면 32 비트 프로세스에서 더 많은 메모리에 액세스 할 수 있습니다. 그런 다음 Address Windowing Extensions을 사용하여 메모리 페이지를 32 비트 메모리 안팎으로 스왑해야합니다.

+0

또한 32 비트 프로세스는 64 비트 OS에서 ~ 4GB까지 사용할 수 있습니다. – samir105

+0

더 이상 정확하지 않습니다. Embarcadero가 64 비트 컴파일러를 발표 했으므로 이제 답을 업데이트하고 싶을 것입니다. –

6

델파이 포인터는 32 비트입니다. 기간. Delphi 개발자는 반환하려는 64 비트 값을 '저장할'수는 있지만 가리키는 메모리에는 액세스 할 수 없으므로 아무런 쓸모가 없습니다.

이전에, 내가 작성했던 : - 델파이의

64 비트 버전은 "2009 년 중앙"에 대한 Codegear/Embarcadero's road map 에 있습니다. 배를 치는 것은 정확히 날짜, 그래서 당신의 숨을하지 않는 이상 제품의 품질 은 ... 우선 순위를 복용 (! 마지막에)로

것 같습니다 그러나, 2010 년 8 월, 엠 바카 데로는 new roadmap here을 발표했다. 여기에는 구체적인 날짜는 나와 있지 않지만, 컴파일러 미리보기, 예상 가용성, 2011 년 상반기을 언급합니다.

+1

최근 뉴스에 따르면 64 비트 컴파일러는 8 월경에 출시 될 예정이며 (http://tech.turbu-rpg.com/351/odd-timing) 베타 테스트 중에 있습니다. 정확하게 발표 될 내용은 아직 알려지지 않았습니다. –

+1

이번에는 (델파이 x64) 그런 일이 있습니다. Delphi x64의 베타 버전이 있습니다. http://www.embarcadero.com/products/delphi/64-bit – PhiS

2

또한 64 비트 포인터를 32 비트 메모리 주소에 고정하거나 고정 해제 할 방법을 추가 할 수 있습니다. Delphi이기 때문에 Windows에만 국한되어 있다고 확신하므로 Address Windowing Extensions을 사용할 수도 있습니다. 이렇게하면 32 비트 주소 범위에 메모리를 할당, 해제 및 고정 및 고정 해제 할 수 있고 64 비트 메모리 할당 공간을 이용할 수 있습니다. 사용자가 실제로 메모리를 커밋하여 32 비트 가상 주소 공간에 적합하다고 가정합니다.

+0

AWE가 필요한 경우 델파이에서 직접 AWE를 사용할 수 있습니다. AWE를 사용하면 32 비트 프로세스가 32 비트 주소 공간 제한을 초과 할 수 있지만 32 비트 주소 공간으로 페이지 매핑 및 매핑 해제가 이루어 지므로 일부 응용 프로그램에서는이를 유용하게 사용할 수 있습니다. –

5

Free Pascal은 64 비트 버전을 포함하며 대부분 델파이 호환 구문이므로 살펴보십시오.

4

여러 프로세스가 공유하는 메모리를 할당하려면 메모리 매핑 파일을 사용해야합니다.

http://www.delphifaq.com/faq/delphi_windows_API/f348.shtml의 코드는 32 비트와 64 비트 프로세스 간의 통신에 사용할 수 있습니다. 여기

이 단계는 다음과 같습니다

  • 디스크, 중 메모리에 하나, 메모리 매핑 된 파일을 만듭니다;
  • 파일 변경을 알리는 뮤텍스를 만듭니다.
  • 한쪽 끝은 메모리 매핑 된 파일에 일부 데이터를 씁니다.
  • 그런 다음 뮤텍스에 플래그를 지정합니다.
  • 다른 끝은 뮤텍스 알림을받습니다.
  • 그런 다음 메모리 매핑 된 파일에서 데이터를 읽습니다.

모든 데이터를 공유하기 위해 메모리 매핑 파일에 맞춤 바이너리 레이아웃을 만드는 것은 여러분의 책임입니다.

설계 상 메모리 매핑 된 파일은 빠르며 (커널 수준/x86 CPU 기능 임) 대용량 메모리 (32 비트 프로세스의 경우 최대 1GB)를 처리 할 수 ​​있습니다.

이 종류의 통신은 http://cc.embarcadero.com/Author/802978이 32 비트 델피 프로그램에서 64 비트 dll을 호출하는 데 사용됩니다.

+0

오늘 "최대 1GB" "거대한 메모리"라고 부르지 않을 것입니다. –

+0

@ldsandon 이해의 문제입니다. 라이브러리 POV에서 "거대한"데이터가 64 비트면에 남아있게 한 다음 필요한 값의 데이터 전송에만 메모리 맵핑 된 파일을 사용하는 것이 좋습니다. 라이브러리를 호출 할 때마다 전체 데이터를 맵핑하는 것은 의미가 없습니다. MM 파일은 함수 "매개 변수"를 처리하기위한 것입니다. 따라서이 경우 매개 변수에 1GB의 메모리가 필요합니다. –