나는 AVI 파일의 지속 시간을 얻을하는 방법을 보여주는 샘플 스택 오버플로 게시물을 발견 :AviFileExit()을 호출하기 전에이 경우 IAviFile 포인터를 핵으로 남겨 둘 필요가있는 이유는 무엇입니까?
내 델파이 6 응용 프로그램 내 목적을 수정하고 아래 코드를 만들었습니다. 처음에는 AviFileExit()을 호출하기 전에 IAviFile 포인터를 숨기는 선을 제거했습니다. 그러나 내가 그렇게했을 때 AviFileExit()가 호출 될 때 액세스 위반이 발생했습니다. 나는 회선을 복구했고 접근 위반은 사라졌다.
왜 AviFileExit()을 호출하기 전에 IAviFile 참조를 핵 생성해야합니까? 이것은 메모리 누출인가요? 나는 정상적인 인터페이스 참조 카운팅이 여기에서 제대로 작동한다고 생각하지만 분명히 그렇지 않다. AviStreamRelease() 등을 호출하는 것과 같은 오류를 제거하는 또 다른 방법이 있습니까? 당신은 델파이 AVIFileRelease()
인터페이스를 발표 것을 알고하지 않기 때문에 수동으로 변수를 취소해야
function getAviDurationSecs(theAviFilename: string): Extended;
var
aviFileInfo : TAVIFILEINFOW;
intfAviFile : IAVIFILE;
framesPerSecond : Extended;
begin
intfAviFile := nil;
AVIFileInit;
try
// Open the AVI file.
if AVIFileOpen(intfAviFile, PChar(theAviFilename), OF_READ, nil) <> AVIERR_OK then
raise Exception.Create('(getAviDurationSecs) Error opening the AVI file: ' + theAviFilename);
try
// Get the AVI file information.
if AVIFileInfoW(intfAviFile, aviFileInfo, sizeof(aviFileInfo)) <> AVIERR_OK then
raise Exception.Create('(getAviDurationSecs) Unable to get file information record from the AVI file: ' + theAviFilename);
// Zero divide protection.
if aviFileInfo.dwScale < 1 then
raise Exception.Create('(getAviDurationSecs) Invalid dwScale value found in the AVI file information record: ' + theAviFilename);
// Calculate the frames per second.
framesPerSecond := aviFileInfo.dwRate/aviFileInfo.dwScale;
Result := aviFileInfo.dwLength/framesPerSecond;
finally
AVIFileRelease(intfAviFile);
// Commenting out the line below that nukes the IAviFile
// interface reference leads to an access violation when
// AVIFileExit() is called.
Pointer(intfAviFile) := nil;
end;
finally
AVIFileExit;
end;
end;
감사합니다. 적어도 지금 나는 왜 그런지 압니다. –