Q&A

  • [급.급]Dll의 함수를 String으로...
델파이에서 사용할 Dll을 사용합니다.

그런데..String 타입으로 변수를 주고 받으니깐."Access violation"이나오기도하고

"invalid pointer operation"이 납니다."

제가알기에 델파이에서 만들어서 델파이에서 사용할 경우는 굳이 pchar타입으로하지않아도된다고 알고있는데...

부탁합니다...해결방법을...

3  COMMENTS
  • Profile
    장동민 2000.12.31 02:04
    이렇게 해보세요!



    --- dll파일에서는 ---

    procedure IDString(bufferout:pchar);stdcall;

    var

    msg:string;

    begin

    msg:='aaaaaa'

    strcopy(bufferout,pchar(msg));

    end;



    ----본 프로그램에서(오출한)---

    ....

    ....

    var

    procedure IDString(bufferout:pchar);stdcall;external '../DMDBang.dll';



    implementation

    {$R *.DFM}





    procedure......

    begin



    SetLength(out_buffer,100); //100는 담을 버퍼크기 늘려도 좋음

    IDString(pchar(out_buffer));//값을 담아 올 곳을 같이 알려준다.



    end;









  • Profile
    김영석 2000.12.28 07:19
    문자열이 그리 길지 않다면 string 대신에 ShortString 타입을 사용하세요.

    ShortString 는 미리 256개의 char 버퍼를 만들어 놓고 사용하니까

    메모리상으로 문제가 없는데 string 는 메모리가 확보되지 않으면

    dll 에서는 전달이 잘 안되니까 그런거 같습니다. 잘은 모르겠고..

    그리고 그냥 String 를 사용해도 되긴 될텐데 그럴려면 프로젝트와 유닛의

    uses 절에 맨 처음에 ShareMem 을 써줘야 한다고 합니다.

    델파이에서 New 해서 Dll 을 누르면 맨 처음에 나오는 글을 보죠..



    { Important note about DLL memory management: ShareMem must be the

    first unit in your library's USES clause AND your project's (select

    Project-View Source) USES clause if your DLL exports any procedures or

    functions that pass strings as parameters or function results. This

    applies to all strings passed to and from your DLL--even those that

    are nested in records and classes. ShareMem is the interface unit to

    the BORLNDMM.DLL shared memory manager, which must be deployed along

    with your DLL. To avoid using BORLNDMM.DLL, pass string information

    using PChar or ShortString parameters. }



    위와 같습니다. 위의 것을 참고 하면 PChar 이나 ShortString 를 쓰는것이

    좋다고 나와있네요.

    그리고 String 를 쓸려면 PChar 쓸때처럼 미리 String 에 메모리를 확보해 주고

    쓰면 문제가 없을 겁니다.





    김현숙 wrote:

    > 델파이에서 사용할 Dll을 사용합니다.

    > 그런데..String 타입으로 변수를 주고 받으니깐."Access violation"이나오기도하고

    > "invalid pointer operation"이 납니다."

    > 제가알기에 델파이에서 만들어서 델파이에서 사용할 경우는 굳이 pchar타입으로하지않아도된다고 알고있는데...

    > 부탁합니다...해결방법을...

  • Profile
    타락천사 2000.12.27 23:26
    안녕하세여..타락임다..^^



    DLL은 MS 가 만든 형식입니다..^^



    그래서 델파이의 데이터형식을 DLL에 쓸려면 좀 변환을 해 줘야 합니다..^^



    사용자가 변환할 필요는 없지만, 변환시켜주는 모듈은 포함시켜놔야져..^^



    제가 팁모아에 올린 글을 참조하세여..^^



    즐푸하세여..



    타락천사...^^