Microsoft MVP성태의 닷넷 이야기
[답변]: [답변]: [답변]: ASP의 ByVal과 ByRef 특성 [링크 복사], [링크+제목 복사],
조회: 11343
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 
부모글 보이기/감추기


이해하신 것을 정리한 것을 다시 따져 보겠습니다. ^^

  1. ByVal 키워드가 동작하여 Recordset 개체 자체는 의도한 바 그대로 복사본이 넘어갔다.
  2. 그러나 Recordset 개체 내부의 Connection 개체 참조는 여전히 원본 개체와 동일한 참조를 가리킨다.
  3. 따라서 사본 Recordset의 Connection 개체를 닫으면 원본 Connection 개체도 닫히게 된다.

Recordset 자체가 복사본이 넘어간 것이 아닙니다. 메모리에는 이미 Recordset에 대한 개체가 있고, 그 개체를 가리키는 포인터 변수가 있는 상황에서, byval로 넘기면 포인터 변수의 내용이 복사되어 스택에 전달되는 것이고, byref로 넘기면 해당 포인터 변수 자체의 주소가 복사되어 스택에 전달되는 것입니다. 그러니까, 둘다 동일한 RecordSet 개체를 가리키고 있는 것입니다.




질문하신 내용중에는 2번째는 해결하셨으니, 첫 번째 문제를 살펴보면.

1) Set objRecordSet_temp = objRecordSet
2) Set objRecordSet_temp = objRecordSet_temp.NextRecordset 

위에서의 문제를 역시 동일하게 바라보시면 될 것 같습니다. Set으로 인한 할당은 엄밀히 IUnknown::QueryInterface를 호출해서 내부적으로 해당 COM 개체에 대한 ref 카운트를 증가시키고 인터페이스 포인터 값의 복사본을 넘겨주는 것뿐입니다.

따라서, 첫 번째 Set 문의 경우에는 (.NET과 비교하자면) 단지 shallow copy 된 또 다른 별도의 "변수"가 추가된 것일 뿐, "원본 개체를 복사"해서 그 복사된 개체에 대한 인터페이스 포인터를 반환하는 것이 아닙니다.

그 후에 2번과 같은 과정을 거치니, 당연히 원본 Recordset 개체가 NextRecordset으로 되었으므로 Closed 상태로 되어 버리고, temp 변수의 경우에는 (현재 다음 레코드셋이 없는 것으로 보이므로) null 값을 보관하고 있게 되는 것입니다.




[이 토픽에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]







[최초 등록일: ]
[최종 수정일: 6/26/2021]


비밀번호

댓글 작성자
 



2007-05-16 10시26분
그렇군요. 이제 확실히 이해한 것 같습니다.
저의 두 번째 예제가 제대로 동작했던 것도 어느 정도는 운이 좋았기 때문이었군요.
결국은 포인터에 대한 개념이해가 바탕이 되는 문제네요.
감사합니다. ^_^
songgun

1  2  3  4  5  6  7  8  [9]  10  11  12  13  14  15  ...
NoWriterDateCnt.TitleFile(s)
5730김재환10/7/20224568WPF에서 디스플레이 배율이 100%가 아닌 경우, Window의 포지션 정보가 부정확해지는 문제 [2]
5729김기헌10/2/20224213안녕하세요 선생님 뮤텍스 관련 질문 드립니다 [2]
5728김경환9/29/20224227그리드뷰관련마지막질문하나드리겠습니다선생님 [5]파일 다운로드1
5727김경환9/26/20224119c# 윈폼 tcp/ip 기반 데이터그리드뷰질문하나드리겟습니다 [3]
5726양승조 donator9/22/20224822C# dll 과 C++ 간 배열 전달. SafeArray [10]파일 다운로드1
5725김기헌9/21/20223722안녕하세요 선생님 윈폼 컨트롤 Dispose 관련 질문드립니다 [2]
5724감사합니...9/19/20223757스레드와 스레드 안전한 객체 사용관련 문의드립니다. [5]
5723드리렁9/13/20223688Pinned Object에 대해서 질문이 있습니다. [2]
5722김인태9/8/20223857대화상자에서 alt + tab 후킹 작업 [1]
5721우종9/7/20224023C++ DLL 과 C# 연동 문의 [2]
5720한예지 donator9/6/20223722학습 방법 질문 있습니다. [7]
5719김경한9/6/20224055안녕하세요 질문하나만드리겠습니다...! [10]
5718김민아9/2/20224097안녕하세요 생성자 호출 시 초기화 순서 질문드립니다 [2]
5716iili...8/26/20224323WinDbg 커널 디버깅에서의 thread freeze [2]
5715에릭8/19/20224720WMI 쿼리 결과값이 Windows Service와 Console 출력에서 상이한 이유가 있을까요? [9]파일 다운로드1
5714허니빠8/18/20224751.net6 hint path 를 프로젝트 단위로 지정할 수 있는 방법을 알고싶습니다 [8]
5713김기헌8/17/20224676안녕하세요 rgb 계산 오차가 있는데 원인을 모르겠습니다.. [3]
5712하태8/17/20224153안녕하세요 background service에서 user32dll 접근 질문 드리겠습니다.! [2]
5711하태8/16/20223672안녕하세요! 윈도우즈 해상도 관련 질문 드립니다. [1]
5710장성욱8/12/20223886c# 시리얼 통신 관련 질문 [3]
5709초보8/12/20223697WPF 커맨드 관련 질문 [2]
5708민성8/11/20223947안녕하세요 c#에서 화면의 배율 및 레이아웃을 변경할려면 어떻게 해야 할까요? [2]파일 다운로드1
5707민성8/10/20223592WPF 엣지 컨트롤에서 화면이 안보이는 현상 [2]파일 다운로드1
5706종규8/7/20226017WPF 에서 SVG 아이콘 사용 방법 문의 [2]
5705김기헌8/6/20224718안녕하세요 선생님 싱글톤 패턴 간단 질문 [2]
5704따봉이8/4/20224630EventHandler 관련 [1]
1  2  3  4  5  6  7  8  [9]  10  11  12  13  14  15  ...