Q&A

  • [답변]Invaild pointer operation 오류 처리법
안녕하세요. 지지난주쯤에 제가 [질문]올렸는데, 아무도 답변해주시는 분이 없어서 제가 해결책을 찾았습니다.

exe 파일의 프로젝트 유닛에다가, pMain.dpr
program Main;
uses
  //ShareMem 유닛을 추가합니다. 꼭 맨 위에다가 써야 합니다.
  ShareMem,                                    
  Forms,
  uFrmMain in 'uFrmMain.pas' {frmMain},
  uConstant in '..ModulesuConstant.pas';

마찬가지로 dll 파일의 프로젝트 유닛에다가, pDBFuncs.dpr
library DBFuncs;
uses
  //ShareMem 유닛을 추가합니다. 맨 위에다가 쓰지 않아도 됩니다.
  ShareMem,
  SysUtils,
  Classes,
  uDBFuncs in 'uDBFuncs.pas';

이렇게 적으면 오류가 안생깁니다.

이 오류가 생기는 이유는 exe 에서 dll 에 넘기거나 받는 파라메타가 PChar 등 C 계열 변수가 아니고 클래스이기 때문입니다. 즉 스트링변수나 콘트롤등을 파라메타로 넘기면 포인트 오류가 생기는 겁니다. 위에서 쓴 방법은 델파이에서만 쓸 dll 일 경우에 해당하는 겁니다. dll 을 vb 나 c 등 다른 언어로 만든 프로그램에서 불러쓸 경우에는 이 방법이 통하지 않습니다. 앞서 설명했듯이 PChar 과 같은 변수로 변환시켜서 파라메타를 주고 받아야 합니다.

exe 에서 ShareMem 을 맨위에 쓰지 않으면 Access Violation ~~ 오류가 생깁니다. dll 에서는 아무대나 써도 안생기는 것을 확인했습니다.

참고로 이 처리방법은 dll 프로젝트를 생성하면 프로젝트 유닛에 설명이 되어 있습니다. 다음과 같이...

library DBFuncs;   //dll project name.

{ 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. }

uses
~~~

그럼 즐코하세요.


0  COMMENTS