VBA 참조 카운트 - 객체 파괴
최근에 나는 나를 더 힘들게 만드는 질문에 부딪혔다. 그것은 나를 바쁘게 만들었고 나는 인터넷에서 그것에 대한 투명한 설명을 찾을 수 없었다.
Excel 오브젝트 파괴와 관련되어 있습니다(항상 사용하고 있기 때문에 실제로 질문해 본 적이 없습니다).
「CHANGE MARGE:」
일반 개체에서는 SET 및 NEW 키워드를 사용하여 개체를 인스턴스화할 수 있습니다.를 들면, '먹다'와 같이요.
Set classInstance = New className
힙가 1.방방방 is is is is is is is is씩씩씩씩씩씩씩 1 씩씩씩씩 is is is is is is whenever whenever is is is is is is whenever is is is whenever whenever is is is whenever whenever whenever is 。
.
Set classInstance = Nothing
참조 카운트가 0이 되면 오브젝트가 파기되어 메모리와 "클래스"에서 삭제됩니다.인스턴스"는 을 가리킵니다.
은은: :
CREATEOBJECT COM을 사용합니다.
Set oApp = CreateObject("Excel.Application")
이렇게 말할 수 있지만
Set oApp = nothing
개체의 참조 수가 0이 되고 oApp은 더 이상 개체를 가리키지 않습니다.
질문:
이 입니까?.1 )。개체를 메모리에서 실제로 제거하기 전에 종료하시겠습니까?
메서드가 open)에를 추가할 입니다.close books close close close close close close close close close close close close ( workbooks . add 또워크북.open ) 。참조 카운트를 0으로 했을 때 이러한 오브젝트를 자동으로 파기할 수 없는 이유는 무엇입니까?
우리가 '아까보다'라고 때 그렇습니다.
set oRange = nothing
2) 그리고 다음과 같이 말할 필요가 있는가?
oApp.Quit
set oApp = nothing
응용 프로그램오브젝트는 적용 시 메모리에서 이미 지워져 있기 때문입니다.종료합니다. 더 이상 해제할 개체가 없습니다.
종료 후 oApp이 아무것도 아닌 것으로 설정되는 유일한 이유는 oApp이 사용되지 않는 메모리 위치(히프)를 가리키고 나중에 이 메모리가 재할당될 경우 혼란을 초래할 수 있기 때문입니다(VBA에서는 상상하기 어렵지만).저는 이 결론이 맞는지 궁금했고, 답을 아는 사람에게 확인을 받고 싶습니다.
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
3) VBA에서 말하는 오브젝트에 대한 참조(위 코드의 oApp 등)는 C에서는 포인터 변수로 간주됩니다.이 문장을 사용하는 것이 안전할까요, 아니면 다시 사용하는 것이 잘못된 것일까요?
일반적으로 적용하기가 어렵지 않습니다.종료하고 아무것도 설정하지 않습니다만, 토픽에 관한 정확한 정보를 얻을 수 있으면 좋겠습니다.내가 왜 하는지 100% 알 수 있도록.
좋은 질문:)
Excel은 객체 생성을 제어합니다.마찬가지로 그것은 또한 그들의 파괴를 통제한다.
★★oApp = Nothing
이치노애플리케이션은 삭제되지 않습니다. 객체를하려면 Excel 객체를..Quit
★★★★★★ 。
때마다 그그 whenever whenever whenever whenever wheneverSet x = Nothing
, 「 」라고 하는 복수 「 」(복수)입니다.x
해당 객체에 대한 해당 객체가 제거됩니다.이것은 오브젝트 자체가 메모리에서 삭제되는 것을 의미하는 것은 아닙니다.메모리로부터 오브젝트를 삭제할지는, 다양한 요인에 의해서 다릅니다.
- 동일한 개체를 가리키는 참조가 더 있는지 여부입니다.존재하는 경우 오브젝트는 삭제되지 않습니다.참조 카운트는 0이어야 합니다.
- 해당 개체의 소멸자 내부 구현입니다.
.Quit
method는 Excel 객체가 할당한 메모리를 모두 제거하고 자동으로 닫도록 정의되어 있습니다.
은, 「Calling 「Calling」이라고 하는 것」과.Close
VB6를 사용합니다.vb6의 을 예로 들 수 있습니다.
Dim f As Form
Set f = Form1
f.Show
'
'~~> Rest of the code
'
Set f = Nothing
이렇게 하면 폼이 망가질까요?:)
따르다
그럼 2번 어때요?감사합니다 – Kim Gyssen 14분 전
여기에 표시된 것과 다를 수 있으며 컴파일러 최적화에 따라 동작이 달라질 수 있습니다.이게 기본 콘셉트예요.
질문의 2부는 매우 흥미롭습니다.또한 자세한 답변을 할 가치가 있습니다.
여기에서는, 다음의 3개의 요점을 설명합니다.
- 객체 및 객체 변수
- 오브젝트를 폐기할 때의 함정
- 그리고 Excel 2013에서 Application 객체의 참조 카운트에 중요한 변화가 있습니다.
이제 계속 읽어보세요...
는 Excel공간에 변수가 있는 또 개체는 "Excel " " " " " " " " " " 소소 " " " " " " " :::: " " " " " 。 일부 개체는 개체 변수가 제거된 후 영구 구성 요소를 갖습니다. 하다
Set oDict = CreateObject("Scripting.Dictionary")
Set oWShell = CreateObject("Shell.Application")
모두 변수할 수 .
Set oDict = Nothing
Set oWShell = Nothing
그리고 해고당해도 그들의 흔적은 남아있지 않다.
단, 이 오브젝트는 영속적입니다.
Dim oWbk as Excel.Workbook
Set oWbk = Application.Workbooks.Add
...You've created a new workbook object and, if you dismiss the object variable with
Set oWbk = Nothing
, you will see that the new workbook object still exists as a visible presence in the user interface.
실제로 만든 것은 Workbook 오브젝트(활성 워크시트와 이에 대응하는 풀 사용자 인터페이스)와 Workbook 오브젝트 변수(프로그래머의 COM 인터페이스, Workbook 오브젝트의 메서드 및 속성 테이블)입니다.이러한 워크북오브젝트는 이름 있는 엔티티 'oWbk'를 사용하여 코드로 조작할 수 있습니다.
oWbk 개체 변수를 삭제하면 해당 프레임워크는 삭제되지만 워크북 자체는 계속 존재합니다. 워크북 개체를 생성했으므로 사용자가 보관할 수 있습니다.
오브젝트는 오브젝트 변수 이상이며 변수를 해제해도 오브젝트는 파괴되지 않습니다.코드에서 오브젝트를 조작하기 위해 사용할 수 있는 메서드 및 속성의 프레임워크인 인터페이스를 해제합니다.
저장 및.
'try this:
oWbk.Close SaveChanges:=False
' or maybe this:
Application.Workbooks(Application.Workbooks.Count).Close SaveChanges:=False
...That is to say, you would expect both of those commands to call
Set oWbk= Nothing
- especially the
oWbk.Close
command - but if you try either of them without explicitly dismissing oWbk, you will find that
oWbk
still exists as an empty husk, and all calls and requests for information on it (try>
Debug.Print> TypeName(oWbk)
) will return
'자동화 오류' messages.
에서 몇 가지 언급을 .UserForm
이 개체는 사전 및 셸 개체와 달리 사용자 인터페이스가 표시되는 개체입니다.그러나 이 사용자 인터페이스는 워크북이나 워크시트처럼 Excel 사용자 인터페이스의 영구적인 새로운 개체가 아닙니다.
세션에 다시 할 수 .
Set oWbk = Application.Workbooks(Application.Workbooks.Count)
...Assuming, of course, that you have some way of being sure that you identified the right workbook object: but that's not your question at all.
이 답변은 Excel 세션의 '소유' 메모리에 생성되지 않은 객체입니다.
Set oApp = CreateObject("Excel.Application")
This statement will create an Excel object which, like the new Workbook, has a User Interface (although you'll need to set the
.Visible
property True to see it) and and a persistent presence in memory: once again, the object is more than its object variable, and dismising the variable does not destroy the object.
새로운 워크북과 달리 명령할 수 있는 것은 아닙니다.Excel 세션 자체이며, 자체 메모리를 할당합니다. 현재 세션의 메모리에 있는 oApp의 '풋프린트'는 포인터이자 인터페이스(vTable, iDispatch,또한 VBA에서 Excel 세션을 조작하는 복잡한 동작을 구현하는 구조에 대한 포인터를 가진 명명된 메서드는 모두 이 새로운 Excel 세션에 의해 할당된 메모리 블록에 존재합니다.
Office 2010 및 이전 버전의 Excel에서는 다음과 같은 특징이 있습니다.
를 ""로 해제:Set oApp = Nothing
세션을 실행 상태로 유지하며 세션을 수동으로 닫을 수 있도록 표시할 것을 강력히 권장합니다.
oApp 객체 변수를 명시적으로 무시하지 않고 Excel 세션을 수동으로 닫으면 oApp은 분명 '빈 허스크' 상태가 되고 코드 베이스의 어두운 구석에서 '자동화 객체가 클라이언트에서 연결이 끊어졌습니다!'라는 비통한 외침이 발생합니다.
Office 에서는 Office 2013 하 but ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★」Set oApp = Nothing
는 예상대로의 참조 패킷을 실행하고 세션을 종료합니다.해 보세요: ★★★★★★★★★★★★★★★★★★★★★:
Private Sub Test()
Dim oApp As Excel.Application
Set oApp = New Excel.Application
'Set oApp = CreateObject("Excel.Application")
oApp.Visible = True
Set oApp = Nothing
End Sub
It won't close on
Set oApp = Nothing
if another object variable has a reference - and that's not the only entity that gets to increment the reference counter: user activity in the GUI (try creating a new workbook and editing it) keeps the session up and running, too.
한번 oApp.Quit
하고 oApp으로 합니다.Nothing
.
★★★★★★★★★★★★★★★★★.oApp.Quit
확실히 세션을 종료합니다.
...그렇지 않으면?해당 세션에서 긴 계산 또는 애플리케이션 개체가 사용자 인터페이스 또는 VBA에서 다른 입력에 응답하기 전에 보고 클릭해야 하는 '모달' 오류 메시지가 있을 경우oApp.Quit
세션을 닫지 않습니다.
거기 가지 맙시다.가 같으면oApp.Quit
2010년 엑셀.
그러나 Office 2013에서 마지막 개체 변수에서 '종료'를 호출하면 UI가 숨겨집니다. 개체 변수는 여전히 코드에 응답합니다. 활성 워크북이 필요하지 않은 메서드와 속성은 oApp을 통해 액세스할 수 있습니다. Excel.exe의 개별 인스턴스는 작업 관리자의 프로세스 탭에 명확하게 표시됩니다.
마찬가지로 사용자 인터페이스에서 '닫기' 버튼을 클릭하여 새 세션을 종료하면 세션의 창이 닫히지만 코드에 이 응용 프로그램 개체를 참조하는 개체 변수가 있는 경우 해당 개체는 메모리에 있고 'oApp'은 속성과 메서드를 계속 사용할 수 있습니다.
따라서 참조 카운터는 Excel의 현재 버전에서 두 가지 방식으로 작동합니다. 참조 카운터가 0으로 감소할 때까지 개체가 존재하며 마지막 남은 개체 변수는 종료 명령 또는 UI 액션에 의해 '연결 해제'된 상태로 남아 있지 않습니다.
하고 '오너마지막 오브젝트 변수를 삭제하고 다음으로 설정한 경우Nothing
게다가 유저의 조작이나 내부 프로세스 등, 새로운 세션의 존속성을 유지하는 것이 있습니다.어플리케이션과 같은 것은 없습니다.워크북() 또는 워크시트() 컬렉션은 다른 Excel 세션을 식별하고 Excel의 특정 인스턴스를 가리키는 개체 변수를 인스턴스화합니다.응용 프로그램오브젝트
API 호출을 사용하여 특정 세션을 얻는 방법은 있지만 원하는 만큼 신뢰할 수 없습니다.
그래서 전체적으로 보면 '2부'에는 상당히 많은 내용이 들어있습니다.
언급URL : https://stackoverflow.com/questions/11395180/vba-reference-counting-object-destruction
'programing' 카테고리의 다른 글
VBA에서 전원 쿼리를 자동화하는 방법 (0) | 2023.04.17 |
---|---|
Windows NT 그룹/사용자에 대한 정보를 가져올 수 없습니다. (0) | 2023.04.17 |
Excel through vba에서 행 전체가 공백인지 확인하는 방법 (0) | 2023.04.17 |
디렉토리의 모든 파일 및 폴더 삭제 (0) | 2023.04.17 |
리모트 브랜치가 삭제된 오리진에서 가져오시겠습니까? (0) | 2023.04.17 |