2011-08-01 21 views
2

내 앱을 종료 할 때 가끔 이런 일이 발생합니다. 앱에서 네트워크를 통해 EXE를 실행하고 있습니다. EXE의 일부가로드 될 때 페이지 폴트라고 생각합니다.D2006 앱에서 외부 예외 C0000006 가져 오기 - 어떻게 델파이가 전체 실행 파일을로드하도록 강제 할 수 있습니까?

TDrawGrid의 OnDrawCell 메서드에서도이 점을 관찰했기 때문에 페이지로드가 어떻게 발생했는지 궁금합니다. 또한 예외는 계속 발생했습니다.

그래서 내 질문 :

다른 원인에 C0000006 결과를 오류 수 있습니까? 앱이 메모리를 관리하는 방식에 상당한 변화를 가져 왔지만, 평범함이 아니어도 코드가 작동하고 있다고 확신합니다.

어떻게 시작시 응용 프로그램을 모두 메모리에로드 할 수 있습니까? (Delphi 2006에서는 Delphi의 이후 버전 용 지시문이 있음).

TIA

+1

[외부 예외 C0000006] (의 중복 가능성 http://stackoverflow.com/questions/1317886/external- 예외 -c0000006) –

+0

@ David. 네, 그렇습니다. 그러나 그 질문은 D2006에서 이것을 할 수 없다는 인상을 남겼습니다. – rossmcm

+0

나는 똑같은 문제가 있었다. Windows 7 Virtual PC에서 "Windows XP Mode"로 실행 파일을 테스트해야했습니다. 나는 내 컴퓨터의 클라이언트가 XP-32이고 Seven-64를 가지고 있기 때문에 그렇게했다. 이제는 XP Mode가 사용하는 Virtual Sync Disk에서 실행했기 때문에 그 사실을 알고 있습니다. 폴더를 XP 가상 디스크에 복사하고 실행해야합니다. – PSyLoCKe

답변

4

$SetPEFlags은 Delphi 2006의 일부인 것처럼 보이며 적어도 Hallvard는 D2006의 문맥에서 this article에 대해 회담합니다. 그것을 사용하는 방법에 대해서는 here을보십시오.

+0

@ David. 훌륭한 기사. 프로젝트 파일에'{$ SetPEFlags IMAGE_FILE_RELOCS_STRIPPED + IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP} '을 추가하고 8MB 실행 파일에서 370k를 깎아 냈습니다. – rossmcm

+0

@ross IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP을 사용하면 어떤 영향을 미칩니 까? –

+0

안녕하세요 @ David. 아니오 - 그리고 나는 그걸 좋아할 것입니다 ... – rossmcm

2

우리는 이것을 경험합니다. 시스템은 실행 가능 페이지의 일부를 스왑에 넣고 얼마 후에 다시 페이지하지 못합니다. 잠자기 후에 복원되는 네트워크 연결과 관련이있는 것 같습니다.

우리가 발견 한 유일한 해결책은 로컬 컴퓨터에서 실행 파일을 찾는 것입니다.

+0

Thanks @ David. 앱이 시작한 후 합리적인 크기의 덩어리를 할당함에 따라 그 수치가 나타날 것입니다. PE 헤더 플래그 수정에 대한 언급을 보았지만 꽤 무서운 것으로 들립니다. – rossmcm

0

이 예외 C0000006은 소프트웨어가 네트워크 드라이브에서 실행되는 경우에 종종 발생합니다. 이 문제를 방지하려면 다음과 같은 플래그 플래그

{$SetPEFlags IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP} 

을 결합 할 수 있습니다 :

IMAGE_FILE_NET_RUN_FROM_SWAP = $0800; 

{$SetPEFlags $0C00}