여기 저기 참고하여 무엇이 문제인지 찾았습니다.
그래서 정리하는 의미에서 몇자 적어봅니다.
// 구조체에 대한 record 생성 부분은 생략 합니다. GList라는 record를 생성함.
PGList = ^GList; // record에 대한 포인터 선언
var
List, StartList : PGList;
begin
List := GetGList();
StartList = List; // List 포인터를 증가하면서 데이터 처리를 해야 함으로 시작주소를 저장해 놓음.
for Loop := 0 to nCnt-1 do // nCnt에 대한 것은 다른 함수를 통해 넘겨 받음.
begin
// List에 대한 내용 처리.
Inc(List); // 포인터에 대한 증가 C에서는 List++;
end;
List = StartList; // 원래의 주소 값으로 바꿔줌.
end;
델파이를 처음하다보니 증가에 대한것을 잘 이해를 못했고
C에서 처럼 배열은 포인터다라는 생각을 가지고 있다 보니 해결이 안 되었던것 같습니다.
그리고 record 를 생성하면서 packed를 사용하다 보니 보내는 쪽과 데이터크기가 맞지 않았습니다.
구조체 데이터를 넘겨받을 때 데이터가 이상한 것은
1. 구조체와 record 간의 데이터 타입 변환이 잘 되었는지 확인.
2. packed를 양쪽 모두 사용하던지 모두 사용 안하던지 확인.
그러면 전혀 문제없이 사용이 가능할 것으로 봅니다.
조금 이나마 도움이 되었으면 합니다.
박귀정 님이 쓰신 글 :
: 답변에 감사드립니다.
:
: 그러면 그냥 레코드 포인터만 선언해서 넘기면 된다는 말씀이신지...
: 레코드 포인터만 넘기면 된다면은
: 결과로 받은 List를 List[0] , List[1] 형태로해서 개수 만큼 사용하면 되는 건가요.
: 함수 선언은
: Function GetGList() : List; stdcall; external 'BugAPI.dll';
: 이렇게 하면되나요?
:
: kylix 님이 쓰신 글 :
: : var
: : List: ^GList;
: : begin
: : List := GetGList;
: : end;
: :
: : 박귀정 님이 쓰신 글 :
: : : VC++ DLL에서 생성한 struct data list를 델파이에서 record 포인터로 받을 수 있는지요?
: : :
: : : 예를들면
: : : typedef struct _GList
: : : {
: : : UINT1 status;
: : : UINT4 wpx;
: : : UINT4 wpy;
: : : }GList;
: : :
: : : === dll 함수 ===
: : : GList * PASCAL GetGList() ;
: : :
: : : 위와같은 구조체에서 100개의 데이터를 dll에서 메모리 할당해서 델파이로 넘긴다고 한다면
: : : 그냥 record 포인터로만 받으면 되는지... 받을 수 있다면 어떻게 하면 되는지 알려주십시오.
|