소스를 다 올려드리는 것 보다는 더 좋을 것 같아서 부분적인 설명을 달았습니다.
이해 안되시는 부분이 있으시면 글을 남겨 주십시오.
DLL에 대한 기본적인 이해는 www.codeway.co.kr 의 동영상강좌 란에 가보시면 중급자 과정에 잘 나와있습니다.
저도 거기 보고 DLL을 이해 했습니다. 정적사용 동적사용 모두 잘 나와 있습니다. 시간도 많이 걸리지는 않습니다.
stdcall, pascal, cdecl 관련한 내용은 google에서 __cdecl, __pascal, __stdcall 검색어로 검색해 보시면 잘 나와있습니다. 이부분은 저도 이해를 완전히 하지는 못했고 VC++ DLL 만드는 것이랑 델파이에서 정적사용으로 함수 선언할 때 맞아야 한다는 정도만 이해를 했습니다.
소스 간단 설명.
1. VC++ DLL 부분
typedef struct _GList
{
UINT1 status; // unsigned char
UINT4 wptx; // unsigned int
UINT4 wpty;
char path[MAX_PATH]; // 260자
} GList;
int PASCAL GetCount();
GList * PASCAL GetGList() ;
=== 델파이 소스 ==
type
PGList = ^GList;
GList = record
status : Byte;
wptx : Longword;
wpty : Longword;
path : array [0..259] of Char;
end;
Function GetCount() : Integer; stdcall; external '.\dll\GListAPI.dll';
Function GetGList() : PGList; stdcall; external '.\dll\GListAPI.dll';
procedure TMainForm.GetListBtnClick(Sender: TObject);
var
List, StartList : PGList;
nCnt, Loop : Integer;
begin
nCnt := GetCount;
List := GetGList();
StartList = List;
for Loop := 0 to nCnt-1 do
begin
........
Inc(List);
end;
List = StartList;
end;
kylix님께서 알려주신 방법으로는 아직 테스트를 못해봤지만 별도로 시작주소를 저장할 필요가 없다고 한다면
상당히 좋은 방법인것 같습니다.
멀더 님이 쓰신 글 :
: 멀더 입니다.
: 델파이에 관심 많은 ... 개발자 입니다.
: 님의 글을 보니까 dll, point, record 등 다양한 내용이 포함될듯한데....
: 스터디에 많은 도움이 될것 같습니다.
: 관련 소스를 올려 주시면 많은 도움 될 것 같습니다.
: 부탁해요~~~
:
: 박귀정 님이 쓰신 글 :
: : 여기 저기 참고하여 무엇이 문제인지 찾았습니다.
: : 그래서 정리하는 의미에서 몇자 적어봅니다.
: :
: : // 구조체에 대한 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 포인터로만 받으면 되는지... 받을 수 있다면 어떻게 하면 되는지 알려주십시오.
|