Q&A

  • C++로 만든 DLL루틴 끌어쓰기????
안녕하세요..델파이는 아직 높은산으로 느끼는 사람입니다.

다름이 아니라 C++로 짠 DLL을 델파이에서 호출을 하려고 하는데요...

으으...아직 델파이 개념이 별로 없어서...힘드네요.



적절히 끼워맞춰보고 호출을 했는데 여지없이 violation error가 뜹니다.

'Access violation at address 00000003. Read of address FFFFFFFF'

일케 뜨는군요.

정말 급한데...어케해야하죠?

도움 좀 부탁드리겠습니다.





1. C측의 헤더.

struct sChannelHandle {

ULONG dwHwnd;

ULONG dwMsg;

ULONG dwBaseAddress;

ULONG dwIOPort;

ULONG dwChannel;

unsigned char *pBuffer;

BYTE cCodecType;

BYTE cPCMType;

short wNum;

unsigned char *pFilename;

short wMaxWrite;

HANDLE hContentDevice;

HANDLE hProtelDevice;

HANDLE pSemaphore;

short wUserChannel;

};



typedef struct sChannelHandle ChannelHandle;



2. DLL 루틴.

ChannelHandle* PtOpenChannelHandle( int wChannelNumber, HWND Hwnd, UINT Msg,short Mask );



인자

int wChannelNumber

원하는 채널 번호 값

1~64사이만 가능



HWND Hwnd

메시지를 받고자 하는 윈도우의 핸들값



UINT Msg

받고자 하는 메시지의 ID



short Mask

1 : 반드시 Close된 채널만 사용할수 있다

2 : Close 되지 않은 채널도 Open할 수 있다



Return 값

성공 : ChannelHandle *

실패 : FALSE



3. 호출예제(델파이)

unit Unit1;



interface



uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

StdCtrls;



type

TForm1 = class(TForm)

Button1: TButton;

Label1: TLabel;

procedure Button1Click(Sender: TObject);

{ 버튼이 눌리면 DLL 함수 실행 }

end;



sChannelHandle = packed record

dwHwnd : LongWord;

dwMsg : LongWord;

dwBaseAddress : LongWord;

dwIOPort : LongWord;

dwChannel : LongWord;

pBuffer : PChar;

cCodecType : Byte;

cPCMType : Byte;

wNum : Integer;

pFilename : PChar;

wMaxWrite : Integer;

hContentDevice : LongWord;

hProtelDevice : LongWord;

pSemaphore : LongWord;

wUserChannel : Integer;

end;

pChannelHandle = ^sChannelHandle;



const

WM_PROTEL : LongWord = 100;

{ THandle = integer;

TCharLower = procedure(str1 : PChar);

}

var

Form1: TForm1;

ChannelHandle : pChannelHandle;

{ Handle : THandle;

CharLower : TCharLower;

}

implementation



{$R *.DFM}

function PtOpenChannelHandle(wChannelNumber:Integer; pHwnd:hwnd; Msg:word; Mask:Integer) : pChannelHandle; stdcall; external 'abc.dll';



procedure TForm1.Button1Click(Sender: TObject);

begin

Label1.caption := '123';

{ Label1.caption := CharLowerA('Abc Def ghi');}

ChannelHandle := PtOpenChannelHandle(1, Application.handle, WM_PROTEL, 1);



end;



begin



end.

2  COMMENTS
  • Profile
    한석희 2000.05.08 19:26
    회색도시 wrote:

    > 안녕하세요..델파이는 아직 높은산으로 느끼는 사람입니다.

    > 다름이 아니라 C++로 짠 DLL을 델파이에서 호출을 하려고 하는데요...

    > 으으...아직 델파이 개념이 별로 없어서...힘드네요.

    >

    > 적절히 끼워맞춰보고 호출을 했는데 여지없이 violation error가 뜹니다.

    > 'Access violation at address 00000003. Read of address FFFFFFFF'

    > 일케 뜨는군요.

    > 정말 급한데...어케해야하죠?

    > 도움 좀 부탁드리겠습니다.

    >

    >

    > 1. C측의 헤더.

    > struct sChannelHandle {

    > ULONG dwHwnd;

    > ULONG dwMsg;

    > ULONG dwBaseAddress;

    > ULONG dwIOPort;

    > ULONG dwChannel;

    > unsigned char *pBuffer;

    > BYTE cCodecType;

    > BYTE cPCMType;

    > short wNum;

    > unsigned char *pFilename;

    > short wMaxWrite;

    > HANDLE hContentDevice;

    > HANDLE hProtelDevice;

    > HANDLE pSemaphore;

    > short wUserChannel;

    > };

    >

    > typedef struct sChannelHandle ChannelHandle;

    >

    > 2. DLL 루틴.

    > ChannelHandle* PtOpenChannelHandle( int wChannelNumber, HWND Hwnd, UINT Msg,short Mask );

    >

    > 인자

    > int wChannelNumber

    > 원하는 채널 번호 값

    > 1~64사이만 가능

    >

    > HWND Hwnd

    > 메시지를 받고자 하는 윈도우의 핸들값

    >

    > UINT Msg

    > 받고자 하는 메시지의 ID

    >

    > short Mask

    > 1 : 반드시 Close된 채널만 사용할수 있다

    > 2 : Close 되지 않은 채널도 Open할 수 있다

    >

    > Return 값

    > 성공 : ChannelHandle *

    > 실패 : FALSE

    >

    > 3. 호출예제(델파이)

    > unit Unit1;

    >

    > interface

    >

    > uses

    > Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

    > StdCtrls;

    >

    > type

    > TForm1 = class(TForm)

    > Button1: TButton;

    > Label1: TLabel;

    > procedure Button1Click(Sender: TObject);

    > { 버튼이 눌리면 DLL 함수 실행 }

    > end;

    >

    > sChannelHandle = packed record

    > dwHwnd : LongWord;

    > dwMsg : LongWord;

    > dwBaseAddress : LongWord;

    > dwIOPort : LongWord;

    > dwChannel : LongWord;

    > pBuffer : PChar;

    > cCodecType : Byte;

    > cPCMType : Byte;

    > wNum : Integer;

    > pFilename : PChar;

    > wMaxWrite : Integer;

    > hContentDevice : LongWord;

    > hProtelDevice : LongWord;

    > pSemaphore : LongWord;

    > wUserChannel : Integer;

    > end;

    > pChannelHandle = ^sChannelHandle;

    >

    > const

    > WM_PROTEL : LongWord = 100;

    > { THandle = integer;

    > TCharLower = procedure(str1 : PChar);

    > }

    > var

    > Form1: TForm1;

    > ChannelHandle : pChannelHandle;

    > { Handle : THandle;

    > CharLower : TCharLower;

    > }

    > implementation

    >

    > {$R *.DFM}

    > function PtOpenChannelHandle(wChannelNumber:Integer; pHwnd:hwnd; Msg:word; Mask:Integer) : pChannelHandle; stdcall; external 'abc.dll';

    >

    > procedure TForm1.Button1Click(Sender: TObject);

    > begin

    > Label1.caption := '123';

    > { Label1.caption := CharLowerA('Abc Def ghi');}

    > ChannelHandle := PtOpenChannelHandle(1, Application.handle, WM_PROTEL, 1);

    >

    > end;

    >

    > begin

    >

    > end.

    글쎄요.. packed record 까지 쓰신것 보면 DLL 사용에 일가견이 있으신듯 한데..

    혹시 C 컴파일시 byte align을 잊으신 것은 아닌지 확인해 보시고..



    제 경우에는 sizeof(struct sChannelHandle) 등을 출력하는 함수 하나를 C 소스와

    Delphi 소스 양측에 놓고 직접 확인해 보기도 합니다..

    물론 제 생각이 잘 못된 경우가 많지만 가끔 어이 없는 경우가 생기곤 하지요..

    일종의 안전 장치라고 할까요?



    PS: 갑자기 생각이 나서 수정/추가 합니다..

    물론 calling convensiob을 확인해 보셨겠죠?

    컴파일러에 따라서 stdcall이 아니라 cdecl 일 수도 있으니까요..





  • Profile
    회색도시 2000.05.10 00:07
    으흑흑....T.T

    감사합니다 한석희님.

    제가 헤더파일이 없는상태에서 대충적인 함수 설명루틴만 보며 하다보니

    stdcall 이라고만 생각했네요.

    결국...cdecl 하나 수정하는걸루 끝나버렸습니다. 우째 수정할 생각을 안했는지...

    이 은혜를 어케 갚아야할지...

    속이 다 후련하군요.



    즐거운 시간 되시길...



    한석희 wrote:



    > 글쎄요.. packed record 까지 쓰신것 보면 DLL 사용에 일가견이 있으신듯 한데..

    > 혹시 C 컴파일시 byte align을 잊으신 것은 아닌지 확인해 보시고..

    >

    > 제 경우에는 sizeof(struct sChannelHandle) 등을 출력하는 함수 하나를 C 소스와

    > Delphi 소스 양측에 놓고 직접 확인해 보기도 합니다..

    > 물론 제 생각이 잘 못된 경우가 많지만 가끔 어이 없는 경우가 생기곤 하지요..

    > 일종의 안전 장치라고 할까요?

    >

    > PS: 갑자기 생각이 나서 수정/추가 합니다..

    > 물론 calling convensiob을 확인해 보셨겠죠?

    > 컴파일러에 따라서 stdcall이 아니라 cdecl 일 수도 있으니까요..

    >

    >

    • 강재호
    • 2000.05.04 20:19
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 갱수
      2000.05.04 23:06
      강재호 wrote: > 안녕하세요~ > > 인터넷에 가면 자바스크립터료 자료를 입력 받는 사이트가 많습니다...
    • 최용일
      2000.05.04 21:33
      안녕하세요. 최용일입니다. 델파이 자료실( http://www.delphi.co.kr )에 있는 둥근 버튼예제를 찾아보...
    • 공성환
      2000.05.04 20:19
      이선우 wrote: > 안녕하세요. 좋은 아침입니다. > 다른 Unit에 정의되어 있는 프로시저를 현재 작업중인 ...
    • 하얀까마귀
      2000.05.04 20:16
      안녕하세요 하얀까마귀 입니다.. 다른 유닛에 있는 프로시져를 부르실려면... 반드시 프로시져의 정...
    • 레마
    • 2000.05.04 19:46
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2000.05.04 20:16
      안녕하세요. 최용일입니다. 어떤 에러가 난다는 것이지요? EConvertError예외가 발생한다면 에디트마스...
    • 공성환
      2000.05.04 20:16
      레마 wrote: > 아까 질문한 레마 인데요.. > 조회기간 A,B 모두 string 8자리 (ex: 20000504) > 그리고 ...
    • 레마
    • 2000.05.04 19:35
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2000.05.04 19:41
      안녕하세요. 최용일입니다. OnChanging이벤트에서 AllowChange파라매터를 False로 넘겨주면 A에서 B...
    • 하얀까마귀
      2000.05.04 20:24
      안녕하세요 하얀까마귀 입니다... 레마님이 무얼 하실려는 건지 잘 이해는 안되지만.. onChanging 는...
    • 이영범
    • 2000.05.04 19:34
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 윤석천
      2000.05.05 18:01
      이영범 wrote: > InterBase를 사용하고 있는 사용자입니다.. > 한가지 궁금한 점이 있어서 이렇게 질문을...
    • 박진수
      2000.05.04 22:24
      인터베이스요 제가 써봤는데 불편한게 한두개가 아니에요. !! 일단 inline view 기능이 안돼요. ora...
    • 하얀까마귀
      2000.05.04 20:38
      안녕하세요 하얀까마귀 입니다.. 저두 인터베이스를 써본적이 없어서 정확하지는 않습니다만... 무료는 ...
    • 레마
    • 2000.05.04 19:03
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2000.05.04 19:30
      안녕하세요. 최용일입니다. 날짜 형식이 어떤식인가요? YY-MM-DD 이건가요? 어떤형식이든간에 아뭏든 ...
    • 어린왕자
      2000.05.04 21:35
      심육섭 wrote: > 안녕하세요.. 제가 너무 급합니다. > 델파이4를 씁니다. 그런데 홈페이지를 링크해야 하...
    • 2000.05.04 19:03
      심육섭 wrote: > 안녕하세요.. 제가 너무 급합니다. > 델파이4를 씁니다. 그런데 홈페이지를 링크해야 하...
    • 하수
      2000.05.04 19:15
      저는 배너 광고를 클릭하면 ..대당 싸이트로 가는 방법을 설명하겠습니다. 간단히 컴포너트 추가 하나로 ...
    • 변인호
      2000.05.04 19:09
      심육섭 wrote: > 안녕하세요.. 제가 너무 급합니다. > 델파이4를 씁니다. 그런데 홈페이지를 링크해야 하...
    • 레마
    • 2000.05.04 18:36
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 변인호
      2000.05.04 18:53
      레마 wrote: > OnCreate 와 OnActivate 의 차이점이 무엇인지..좀 알려주세요.. 아주 간단한 내용입니...
    • 최용일
      2000.05.04 19:00
      안녕하세요. 최용일입니다. 리치에디터 데모에서 CurrText는 리치에디터에 있는 현재셀의 문자들의 속성...
    • 정은아
    • 2000.05.04 09:44
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 이재원
      2000.05.04 11:05
      Format을 쓰셔서 리스트박스에 넣기전에 왼쪽 정렬 시켜주시거나 아님 만약 A,B,C가 다른 컬럼에 들더가도 ...
    • 정연
    • 2000.05.04 08:32
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 김일영
      2000.05.04 11:08
      ComboBox의 어떤 특정 item만 삭제하고 싶으신가 보군요. cb_user1.items.Delete(index)하면 될 것 같습니...
    • 최용일
      2000.05.04 08:51
      안녕하세요. 최용일입니다. 아래와 같이 하세요. ( 콤보박스의 아이템 인덱스는 0부터 시작합니다.); ...
    • 정연
      2000.05.04 11:26
      최용일님 정말 감사합니당 김영일님두요 되네요 웅하하 꾸우뻑~
    • 최용일
      2000.05.04 08:19
      안녕하세요. 최용일입니다. 그냥 아래와 같이 하면 되는데요. Font속성은 TControl에서 이미 구현해놨으...
    • 한석희
      2000.05.08 19:26
      회색도시 wrote: > 안녕하세요..델파이는 아직 높은산으로 느끼는 사람입니다. > 다름이 아니라 C++로 짠...
    • 회색도시
      2000.05.10 00:07
      으흑흑....T.T 감사합니다 한석희님. 제가 헤더파일이 없는상태에서 대충적인 함수 설명루틴만 보며 하다...
    • 이재원
      2000.05.04 11:15
      지워버려서 잘은 모르겠는데요. 무슨 Fast Net 이러고 불리는것 같던데요. 박성철 wrote: > delphi 4.0...
    • 차니
    • 2000.05.04 05:50
    • 4 COMMENTS
    • /
    • 0 LIKES
    • 김성훈
      2000.05.04 07:27
      차니 wrote: > 안녕하세여 델파이 고수님들..... > Setup화일을 생성해서 인스톨할때 레지스트리값을 설...
    • 차니
      2000.05.04 19:23
      답변 감사합니다. 인스톨쉴드에서 설정해주는 내용은 없나여?? 김성훈 wrote: > 차니 wrote: > > 안...
    • 김성훈
      2000.05.05 12:01
      차니 wrote: > 답변 감사합니다. > 인스톨쉴드에서 설정해주는 내용은 없나여?? > > 김성훈 wrote: >...
    • 愛國靑年
      2000.05.04 20:53
      차니 wrote: > 답변 감사합니다. > 인스톨쉴드에서 설정해주는 내용은 없나여?? > > 김성훈 wrote: >...