Delphi Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
델파이 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
FreePascal/Lazarus
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
델마당
볼랜드포럼 광고 모집

델파이 Q&A
Delphi Programming Q&A
[12177] Re:Re:Re:Re:델파이에서 DLL 함수 호출 후 정상 리턴 된 다음 ...
김용하 [devgod] 2246 읽음    2008-08-24 23:33
Lyn님 조언 감사드립니다.
내일 한번 시도 해 보겠습니다.

그런데 파라미터를 하나씩 처리하는건 되는 이유는 뭘까요...?
참 희안 해요...
암튼 정리 해서 한번 시도 해 보겠습니다.

감사합니다.

Lyn 님이 쓰신 글 :
: 흠... 일단 타잎을 맞춰주시는게 어떨까요
:
: ---function GetResultData(Coeff :PDouble; Size :pinteger; Data:pchar; Flag:pinteger) :integer; stdcall; external ---'FrsSocket.dll';
: 에서
: Coeff : PDouble  -> PSingle //여기가 문제일수도...
: Size : PInteger -> PCardinal
: Data : PChar -> PByte
:
: 이것때문에 문제가 생겻다고 확신은 할 수 없지만... 일단 정리해주시는게 좋을 듯 합니다
:
: : Lyn 님 프로토 타입은 다음과 같습니다.
: : 먼저 델파이 쪽 입니다.
: :
: : function GetResultData(Coeff :PDouble; Size :pinteger; Data:pchar; Flag:pinteger) :integer; stdcall; external 'FrsSocket.dll';
: : 이고요....
: :
: : C++ DLL에서는
: : extern "C" __declspec(dllexport) int GetResultData(float *Coeff, unsigned long *Size, unsigned char *Data, int* Flag)
: : {
: :    
: :     //::SetFocus(pMainProc->m_hWnd);
: :     return pMainProc->GetResultData(Coeff, Size, Data, Flag);;
: : }
: :
: :
: : 이렇게 되어 있습니다.
: :
: : 그런데 이상한건 리턴 파라메터를 하나씩 써서 호출 하면 델파이 프로그램이 죽진 않네요
: : 예를 들어서
: : 델파이에서는
: :
: :                                GetResultData1(@cns_face_value);
: :                                memo1.Lines.Add(FloatToStr(cns_face_value)) ;
: :                                 GetResultData2(@cns_face_size);
: :                                 memo1.Lines.Add(inttostr(cns_face_size)) ;
: :                                 GetResultData3(cns_face_img);
: :                                 memo1.Lines.Add(string(cns_face_img)) ;
: :                                 GetResultData4(@cns_flag);
: :                                 memo1.Lines.Add(inttostr(cns_flag)) ;
: : 이런식으로요
: :
: : 답답해 죽겠습니다.
: :
: :
: : Lyn 님이 쓰신 글 :
: : : 델파이와 C++에서 각각 선언한 문제의 함수 프로토타잎을 보여주세요
: : :
: : : 김용하 님이 쓰신 글 :
: : : : 현재 이미지 핸들링 관련 프로젝트를 진행 중에 있습니다.
: : : : 플로우를 간략하게 설명 드리겠습니다.
: : : :
: : : : 1. VC++을 이용하여 동적 DLL을 제작하여 델파이 엔지니어에게 전달 하였습니다.
: : : : 2. 델파이 프로그램에서 저희가 만들어준 DLL을 링크 합니다.
: : : :     여기서 잠깐 : 저희가 만들어준 DLL에서는 DLL과 저희쪽 Application과 Socket을 연결하여
: : : :                         이미지 데이터를 주고 받습니다.
: : : : 3. 델파이에서 이미지 하나를 DLL을 이용하여 저희쪽 Application에 전송합니다.
: : : : 4. 저희쪽 프로그램에서는 델파이에서 보내는 이미지를 DLL을 통해 받은 후 적당한 처리를 수행 합니다.
: : : :     수행이 다 끝나면 보내온 DLL로 결과를 보냅니다.(이미지와, Float형 값, 정수형값등)
: : : : 5. DLL에서 저희쪽 Application에서 보낸 결과를 받은 후 델파이로 결과를 가지고 갈 것을 요청하는 윈도우
: : : :     메시지를 SendMessage를 이용하여 델파이에게 통보 합니다.
: : : : 6. 그러면 델파이는 DLL함수를 이용하여 결과값을 가지고 갑니다.
: : : :
: : : : 그런데 이때 델파이 프로그램이 비정상적으로 죽어 버립니다.
: : : : 결과값을 다 가지고 가고 나서 말이져.
: : : :
: : : : 그런데 델파이 개발자는 저희 쪽에서 DLL을 잘 못 만들어 그렇다고 버팁니다.
: : : :
: : : : 어떻게 해야 델파이에서 정상적으로 값을 받고 나서 죽지 않을 까요... 미칩니다.
: : : :
: : : : 델파이 소스입니다.
: : : :
: : : : procedure TForm1.getClick(Sender: TObject);
: : : : var fPhoto_img : TMemorystream;
: : : :     fPhoto_img_jpg :TJpegimage;
: : : :     l_return:integer;
: : : : begin
: : : : //                           if l_face_recv_ok = 1 then
: : : :                            begin
: : : :                               try
: : : :                                fillchar(cns_face_size,sizeof(cns_face_size),#0);
: : : :                               l_return := GetResultData(@cns_face_value, @cns_face_size, cns_face_img, @cns_flag); ==> 이부분이 DLL의 함수를 호출 하는 부분
: : : :                               if   l_return = 1 then showmessage('정상') ==> 이 메시지 까지 정상적으로 나온 후 델파이 프로그램이 죽어요
: : : :                               else
: : : :                                 showmessage('실패');
: : : :                                 memo1.Lines.Add(inttostr(cns_flag)) ;
: : : : {
: : : :                                 GetResultData1(@cns_face_value);
: : : :                                memo1.Lines.Add(FloatToStr(cns_face_value)) ;
: : : :                                 GetResultData2(@cns_face_size);
: : : :                                 memo1.Lines.Add(inttostr(cns_face_size)) ;
: : : :                                 GetResultData3(cns_face_img);
: : : :                                 memo1.Lines.Add(string(cns_face_img)) ;
: : : :                                 GetResultData4(@cns_flag);
: : : :                                 memo1.Lines.Add(inttostr(cns_flag)) ;
: : : : }
: : : : {
: : : :                         fPhoto_img := TMemorystream.Create;
: : : :                         fPhoto_img.WriteBuffer(cns_face_img,cns_face_size);
: : : :                         fPhoto_img.Position := 0;
: : : :                         fPhoto_img_jpg := TJpegimage.Create;
: : : :                         fPhoto_img_jpg.LoadFromStream(fPhoto_img);
: : : :                        Image3.Picture.Graphic := fPhoto_img_jpg;
: : : :                        fPhoto_img.Free;
: : : :                        fPhoto_img_jpg.Free;
: : : : }
: : : :                               except
: : : :                               end;
: : : :                            end;
: : : : end;
: : : :
: : : : 이런 문제 저희 DLL에서 수정을 해야 하나요...?
: : : : 이거 델파이쪽에서 해결해야 할 문제 인듯 합니다만....

+ -

관련 글 리스트
12173 델파이에서 DLL 함수 호출 후 정상 리턴 된 다음 ... 김용하 2868 2008/08/22
12175         Re:Re:델파이에서 DLL 함수 호출 후 정상 리턴 된 다음 ... 김용하 2056 2008/08/24
12177                 Re:Re:Re:Re:델파이에서 DLL 함수 호출 후 정상 리턴 된 다음 ... 김용하 2246 2008/08/24
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.