아래의 소스는 일반 Unit에서는 잘 동작을 합니다.
이걸 DLL로 만드니 에러가 발생하는데
메시지는 invalid pointer operation 입니다.
군데군데 메시지를 출력해보니
if lbl_Str.Canvas.Pixels[(iStep*8)+j-1,i-1] = clBlack then begin
부분에서 에러가 발생하는 것 같은데
Unit에서는 잘되는것이 왜 에러가 생기는지 알 수 가 없네요....
Function MakeHangul(sHanStr,sFontName:string; iX, iY, iSize, iType : integer) : String;
var
iWidth, iHeight : integer;
i,j,w,a,iStep,iPos : integer;
sData,Str: string;
Form1 : TForm;
lbl_Str : TLabel;
begin
Form1 := TForm.Create(Application);
lbl_Str := TLabel.Create(Form1);
if sHanStr = '' then exit;
lbl_Str.Font.Name := sFontName;
lbl_Str.Font.Size := iSize;
lbl_Str.Font.Color := clBlack;
if iType = 1 then
lbl_Str.Font.Style := [fsBold]
else
lbl_Str.Font.Style := [];
iWidth := lbl_Str.Width;
iHeight := lbl_Str.Height;
iStep := 0;
iPos := 0;
while iWidth > 0 do
begin
if (iWidth - 8) > 0 then begin
w := 8;
iWidth := iWidth - 8;
end else begin
w := iWidth;
iWidth := 0;
end;
sData := '';
for i := 1 to iHeight do begin
a := $00;
for j := 1 to w do begin
if lbl_Str.Canvas.Pixels[(iStep*8)+j-1,i-1] = clBlack then begin
case j of
1 : a := a OR $80;
2 : a := a OR $40;
3 : a := a OR $20;
4 : a := a OR $10;
5 : a := a OR $08;
6 : a := a OR $04;
7 : a := a OR $02;
8 : a := a OR $01;
end;
end;
end;
sData := sData + IntToHex(a,2);
end;
Str := str + '~DGimg'+IntToStr(iImgCount)+','+IntToStr(iHeight)+',1,'+sData;
Str := str + '^FO'+IntToStr(iPos+iX)+','+IntToStr(iY);
Str := str + '^XGimg'+IntToStr(iImgCount)+',1,1^FS';
inc(iStep);
iPos := iPos + 8;
inc(iImgCount);
end;
Result := str;
Form1.Free;
lbl_str.Free;
end;
Exports
MakeHangul;
DLL파일에서는 string 변수를 쓰면 에러가 납니다.
"To avoid using BORLNDMM.DLL, pass string information
using PChar or ShortString parameters"
DLL파일을 만들었을때 맨위에 주석처리로 써지는 부분인데요
스트링 정보를 전달하려면 Pchar 나 ShortString으로 사용하라고
나오네요
바꿔서 사용하세요