제가 화랑님이 주신 내용을 보고
제가 뽑아낼려는 bite배열에 시작번지값과 마지막 번지값을 알아냈습니다.
그래서
포인터를 그 시작 번지와 마지막 번지사이를 움직여 가며 값을 얻어
올려구 하는데.
binary 형을 bitearrary에 집어넣어놔도 결국은 받아낼때는
string에 집어넣어서 리턴을 해주어야 하는데..
아래 함수는
binary형데이타를 pbitearray에 집어넣고 bite단위로 원하는 문자를 검색해서
원하는 문자의 시작 포인터(배열번지) 을 알아내고 마지막포인터(배열번지)을 알아
내서 그갑을 가지고 루프를 돌면서 그값을 string형에 넣는 것인데 ..
뭐가 잘못 된건가요..
function TFileUpLoad.GetValueByName(InputName: OleVariant): OleVariant;
var
buf : pointer;
bCheck,sCheck : Boolean;
i,j,k,s : integer;
VInputName: String;
first : integer;
second : integer;
BaseString : String;
// lastchr: array of char;
begin
bCheck := False;
sCheck := False;
buf := Pchar(gpDataArray);
VInputName:=InputName;
first:=0;
second:=0;
for i:=0 to (fTotalBytes-2) do
Begin
bCheck := CompareMem(buf,pChar(VInputName),Length(VInputName));
if bCheck then
begin
for k:=i to (fTotalBytes-2) do
begin
sCheck:=CompareMem(buf,pChar(#13#10#13#10),Length(#13#10#13#10));
if sCheck then
begin
first:=integer(buf)+2;
Break;
end
else
inc(integer(buf));
end;//for
for j:=k to (fTotalBytes-1) do
begin
sCheck:=CompareMem(buf,pChar(VarToStr(FBoundary)),Length(FBoundary));
if sCheck then
begin
second :=integer(buf)-2;
Break;
end
else
inc(integer(buf));
end;//for
Break;
end
Else
inc(integer(buf));
End;// for
i:=0;
if first<>0 then
begin
integer(buf):=first;
For s:=first to second do
begin
if integer(buf)=second then
Exit;
BaseString[i]:=char(buf);
Inc(integer(buf));
i:=i+1;
end;
end;
Result:=BaseString;
end;
이런식으로 basestrig이라는 곳에 담아서 리턴을 하는
코드 build하는데는 문제가 없는데..
막상 asp에서 이함수를 호출하면 치명적 오류가 생긴다고 나오네요..
제가 코드상에 뭐가 잘못
Copymemory를 쓰시면 간단히 가져오는데요..
CopyMemory는 API입니다.
VOID CopyMemory (
PVOID Destination, // address of copy destination
CONST VOID *Source, // address of block to copy
DWORD Length // size, in bytes, of block to copy
);
3개의 인자가 있는데.. 처음의 Destination이 저장할 공간입니다..
이것을 보면 address라고 되어 있지요.. 그러니깐 포인터로 저장을 하셔야 합니다.
*Source부분은 Copy할 포인터 Length는 당연 길이가 되겠죠..
님께서 사용하신 코드를 보면 integer에서 다시 char로 변환하는등의 루틴이 보이는데
제가 보기에는 좀 어렵네요.. 그렇게 루프를 돌리시면.. 속도도 느려지니깐
포인터를 사용해서.. Copy 하시기 바랍니다.
이곤섭 wrote:
> 제가 화랑님이 주신 내용을 보고
> 제가 뽑아낼려는 bite배열에 시작번지값과 마지막 번지값을 알아냈습니다.
> 그래서
> 포인터를 그 시작 번지와 마지막 번지사이를 움직여 가며 값을 얻어
> 올려구 하는데.
> binary 형을 bitearrary에 집어넣어놔도 결국은 받아낼때는
> string에 집어넣어서 리턴을 해주어야 하는데..
> 아래 함수는
> binary형데이타를 pbitearray에 집어넣고 bite단위로 원하는 문자를 검색해서
> 원하는 문자의 시작 포인터(배열번지) 을 알아내고 마지막포인터(배열번지)을 알아
> 내서 그갑을 가지고 루프를 돌면서 그값을 string형에 넣는 것인데 ..
> 뭐가 잘못 된건가요..
>
> function TFileUpLoad.GetValueByName(InputName: OleVariant): OleVariant;
> var
> buf : pointer;
> bCheck,sCheck : Boolean;
> i,j,k,s : integer;
> VInputName: String;
> first : integer;
> second : integer;
> BaseString : String;
> // lastchr: array of char;
> begin
> bCheck := False;
> sCheck := False;
> buf := Pchar(gpDataArray);
> VInputName:=InputName;
> first:=0;
> second:=0;
>
> for i:=0 to (fTotalBytes-2) do
> Begin
> bCheck := CompareMem(buf,pChar(VInputName),Length(VInputName));
> if bCheck then
> begin
>
> for k:=i to (fTotalBytes-2) do
> begin
> sCheck:=CompareMem(buf,pChar(#13#10#13#10),Length(#13#10#13#10));
> if sCheck then
> begin
> first:=integer(buf)+2;
> Break;
> end
> else
> inc(integer(buf));
> end;//for
> for j:=k to (fTotalBytes-1) do
> begin
> sCheck:=CompareMem(buf,pChar(VarToStr(FBoundary)),Length(FBoundary));
> if sCheck then
> begin
> second :=integer(buf)-2;
> Break;
> end
> else
> inc(integer(buf));
> end;//for
>
> Break;
> end
> Else
> inc(integer(buf));
> End;// for
>
> i:=0;
>
> if first<>0 then
> begin
> integer(buf):=first;
> For s:=first to second do
> begin
> if integer(buf)=second then
> Exit;
>
> BaseString[i]:=char(buf);
> Inc(integer(buf));
> i:=i+1;
> end;
> end;
>
> Result:=BaseString;
> end;
>
> 이런식으로 basestrig이라는 곳에 담아서 리턴을 하는
> 코드 build하는데는 문제가 없는데..
> 막상 asp에서 이함수를 호출하면 치명적 오류가 생긴다고 나오네요..
> 제가 코드상에 뭐가 잘못