Q&A

  • TStream에 대해서 정통하게 아시는 분 계시나요.
과거 정규 DLL와의 데이터 전송에 대해서 Heap영역에 의해서 많은 AV를 내다가 결국은 해결은 했습니다.
그런데 제가 했던 방법이 옳은 것인지 알 수가 없어서 다른분에게 권장도 못하고 그러네요 ^^

일반적으로 DLL Function을 사용시 Function call하기전에 미리 받을 영역을 Main에서 설정하고
해당 데이터를 가져오는 방법을 취하였지만 간혹 받을 영역이 Dynamic할 경우가 있습니다.

이 경우 DLL내부에서 Setlength, Getmem, new를 사용하여 포인터를 반환하면 AV에러가 대책없이
많이 나오죠
DLL에서 메모리할당하고 해제하더라도 이 정보를 Main에서 참조만 하여도 에러가 납니다.

볼랜드에서는 shared memory dll을 사용하라고 하지만 항시 따라붙는 DLL은 왠지 싫고 사용방법도 모르겠고....

그래서 Tmemorystream을 사용했습니다.
TMemoryStream은 메모리할당이 조금 틀립니다.
(여기에 대한 정확한 이유를 몰라서 묻는거에요 ^^)
GlobalFreePtr, GlobalAllocPtr, GlobalReallocPtr을 사용하여 메모리를 할당하죠
일반적인 FreeMem, GetMem은 메모리관리자에서 할당을 받고요
(Setlength, new, GetMem들은 이쪽이죠)

그래서인지 전혀 AV에러가 나지 않습니다.

묻고자 하는것은 제가 이해하고 있는것이 맞느가 입니다.
1. Application 과 DLL의 Heap영역이 틀리다. (다 알고 있죠 ^^)
2. 그리고 TStream은 Global Heap영역을 쓴다.
3. 그래서 Application 과 DLL에서 TStream에서 만든 영역은 같이 사용할 수 있다.

제가 3년전에 이와같이 해서 AV에러를 피했었거든요 그런데 그 당시에는 방법을 모색하다가 혹시나 하고
적용한 것 이고 문제가 없었습니다.  기술적 이해는 하지않고 "앗 써보니 에러가 안나네 .. ㅋㅋ 이렇게
써야 겠다... 음 TStram이란것은 메모리 영역이 틀리는 구나 " 이렇게 이해했죠.
과연 문제(사용의 제약이나 문제점)가 될 수 있는것이 무엇일까요?
2  COMMENTS
  • Profile
    꼬미사랑 2005.09.13 01:51
    안녕하세요~~
    저희쪽 플젝트팀에서두 SDI,MDI든지... DLL쪽만 콜하고 담에 콜하면 죽는문제가 발생하였습니다..
    메모리가 참조에러..흐흐..
    방향을 잡고 있었는데..의견올려주셔서 감사합니다...
    Static하게 갈려다가..이글을 보게 되어서..



  • Profile
    이중철 2005.09.13 23:00
    기분도 그렇고 ㅋㅋ
    후다닥 해당 샘플 프로그램 만들어 봤어요
    이 프로그램 보시고 판단해 보세요
    그럼 스르륵...
    이번에는 시험삼아서 DLL에서 생성해서 메인에서 해제 해보았네요
    (저도 처음 ㅋㅋ 모두 DLL안쪽에서 Procedure두개 만들어서 생성과 소멸을 다 했는데)