Q&A

  • 구조체에 다른 구조체 포함
<!--CodeS-->
type
   aaa = packed record
             a1 : PChar;
             a2 : PChar;
             a3 : PChar;
  end;
  paaa  =  ^aaa

  bbb = packed record
            b1 : PChar;
            b2 : PChar;
            b3 : PChar;
            a1 : aaa;
  end;
  pbbb  =  ^bbb

  dllfile  = function ( abc : pchar,
                               bbb : pbbb );
<!--CodeE-->
이런 포인터 구조체가 있을때
bbb구조체에는 aaa 구조체가 포함됩니다.
이럴경우 dll을 호출할 때 bbb : pbbb는 파라메터를 어떻게 넘겨야 하는지요..

            a1 := '111';
            a2 := '222';
            a3 := '333';

            b1 := '555';
            b2 := '777';
            b3 := '999';

이렇게 하면 bbb 구조체는 aaa 구조체를 포함할까요?
컴파일 에러는 없는데, 실행시 Access Violation 에러가 나오네요.
invalid pointer 같은 에러도 나오고요.

어째 질문이 횡설수설하네요.. 죄송합니다.
1  COMMENTS
  • Profile
    steps 2008.11.25 02:08
    제 경험에는 dll에 넘길 구조체변수는 new로 메모리를 점유한 다음 값을 넣어 넘겨야 합니다.
    이용후에는 dipose나 freemem으로 해제하는것이 좋구요.

    procedure fcall(abc: pchar; vb: pbbb);
    external 'project2.dll';
    ...
    procedure TForm1.btn1Click(Sender: TObject);
    var vv : pbbb;
    begin
    New(vv);
    vv.b1 := 'b1'; vv.b2 := 'b2'; vv.b3 := 'b3';
    vv.a1.a1 := 'a1.a1';
    vv.a1.a2 := 'a1.a2';
    vv.a1.a3 := 'a1.a3';
    fcall('abc', vv);
    Dispose(vv);
    end;

    // dll부분

    procedure fcall(abc: pchar; vb: pbbb);
    var ss : string;
    begin
    ss := abc + '|' + vb.b1 + '|' +vb.b2 + '|' +vb.b3 +
    '|' +vb.a1.a1 + '|' +vb.a1.a2 + '|' +vb.a1.a3;
    ShowMessage(ss);
    end;