안녕하세요. 답변 주셔서 감사 합니다.
음~ 입출력 버퍼가 작아서 생긴 원인이라고 말씀해 주셨는데요..
rv := get_data(name, dataName, dataSize, Data);
AssignFile (dataFile, savedName);
Rewrite (dataFile);
!! BlockWrite (dataFile, Data^, dataSize, BytesWritten);
CloseFile (imageFile);
에서, BlockWrite 부분을 보면, Write 대상이 dataFile 인데요,
버퍼가 작다는 것은 Write 대상이 작다는 얘기가 되는거 같아서요.
Data^ 부분은 실제 메모리에 있는 데이터의 시작 어드레스를 가지고 있는
포인터 이고, 이 포인터 위치에서 부터 dataSize 만큼 dataFile(실제 파일)에
write 하라는 건데, dataFile은 파일 타입이니까 사이즈 문제에서 어떻게 설정을 해야 하는지요(어떻게 사이즈를 늘리는지..)?
(혹시나 128바이트로 저장하는거 때문에 문제가 아닐가 해서 Rewrite부분에서 저장 단위를 기본 값인 128바이트 말고 1바이트로도 바꾸어 봤었습니다. )
Data 포인터 변수는 get_data에서 이미 Memory Allocation 한후에 데이터를 채운 그 주소를 넘겨 받은 변수 입니다.
TFileStream도 말씀해 주셨는데, TFileStream의 WriteBuffer 메소드를 이용 하려면, Data포인터 변수에 저장된 주소에서 부터, dataSize 만큼의 메모리 영역을 어떤 버퍼(Varinat 타입 같은..) 에 옮겨서 WriteBffer의 파라미터로 넘겨
줘야 하는것 같은데 포인터 주소의 데이터를 어떻게 Variant 타입의 어레이로 카피 하는지 모르겠네요...
---------------- Original Message -----------------
안녕하세요. 최용일입니다.
에러 메세지는 아래와 같구요...
1784 The supplied user buffer is not valid for the requested operation. ERROR_INVALID_USER_BUFFER
입출력 버퍼가 작아서 그런겁니다... dataSize가 입출력버퍼에 비해서 크니까 BlockWrite할때 여러개로 나누어서 파일에 쓰세요...
TFileStream을 쓰시는 것도 좋은 방법이구요...
^^ 항상 즐코하세요...
>안녕 하세요.
>DLL의 라이브러리와 연동하여 프로그램을 작성 하는데 다음과 같은 문제가
>발생하여 여러분의 도움을 기다리고 있습니다.
>
>해당 함수의 프로토 타입은 다음과 같습니다.
>
>function get_data(name:String;
> var data_name:Variant;
> var data_size:LongInt;
> var data:Pointer):Integer;
>
>이 함수를 name이라는 변수에 데이터를 가져올 키값을 넣어 호출 하면,
>data_name에 해당 데이터의 이름, data_size에 데이터 크기, data에 현재 데이터가
>들어가 있는 메모리의 시작 주소의 값이 셋팅 됩니다.
>
>이 함수를 호출 한 다음에 다음과 같이 데이터를 저장 하려고 하는데, 문제가 발생하여
>진행을 못하고 있습니다.
>
> rv := get_data(name, dataName, dataSize, Data);
>
> AssignFile (dataFile, savedName);
> Rewrite (dataFile);
>!! BlockWrite (dataFile, Data^, dataSize, BytesWritten);
> CloseFile (imageFile);
>
>!! 부분의 BlockWrite 에서 오류가 발생하는데 아무래도 Pointer 타입의
>변수인 Data 때문에 발생 하는 것 같습니다.
>
>오류 메시지는 다음과 같습니다.
>"ElnOutError with message I/O error 1784"
>
>여기서 1784의 의미는 무엇일까요? 이 에러 코드를 어디서 찾아볼수 있는지도 궁금 합니다.
>
>해결의 실마리를 찾을 수 있도록 고수님들의 많은 도움 기다립니다.
>
>좋은 하루 되세요~
>
정확한 원인은 아래 원문을 참조하시구요...
fail with ERROR_INVALID_USER_BUFFER or ERROR_NOT_ENOUGH_MEMORY whenever there are too many outstanding asynchronous I/O requests.
BlockWrite쓸때는 4 ~ 32KB씩 나누어서 쓰시는 것이 좋습니다.
TFileStream 사용하실려면 아래와 같이 하시면 됩니다. BlockWrite 와 사용법이 별 차이없습니다.
TFileStream.Write(Data^, dataSize);
or
TFileStream.WriteBuffer(Data^, dataSize);
^^ 항상 즐코하세요...