Skip to content

Commit 46cdca5

Browse files
authored
Merge pull request #4456 from bclothier/ComSafeCleanupLeaks
Clean up COM leaks in Rubberduck
2 parents a177cc5 + 575dd99 commit 46cdca5

31 files changed

+408
-294
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,3 +181,5 @@ Installers/
181181

182182
CodeGraphData/
183183
/Rubberduck.Deployment/Properties/launchSettings.json
184+
/Rubberduck.Deployment/Rubberduck.API.idl
185+
/Rubberduck.Deployment/Rubberduck.idl

Rubberduck.Core/Common/RubberduckHooks.cs

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,19 @@ public class RubberduckHooks : SubclassingWindow, IRubberduckHooks
1919
private readonly IList<IAttachable> _hooks = new List<IAttachable>();
2020
private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
2121

22-
public RubberduckHooks(IVBE vbe, IGeneralConfigService config, HotkeyFactory hotkeyFactory, AutoCompleteService autoComplete)
23-
: base((IntPtr)vbe.MainWindow.HWnd, (IntPtr)vbe.MainWindow.HWnd)
22+
private static IntPtr GetVbeMainWindowPtr(IVBE vbe)
23+
{
24+
using (var window = vbe.MainWindow)
25+
{
26+
return (IntPtr)window.HWnd;
27+
}
28+
}
29+
30+
private RubberduckHooks(IntPtr ptr) : base(ptr, ptr) { }
31+
32+
public RubberduckHooks(IVBE vbe, IGeneralConfigService config, HotkeyFactory hotkeyFactory,
33+
AutoCompleteService autoComplete)
34+
: this(GetVbeMainWindowPtr(vbe))
2435
{
2536
_config = config;
2637
_hotkeyFactory = hotkeyFactory;

Rubberduck.Core/Navigation/CodeExplorer/CodeExplorerComponentViewModel.cs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,9 @@ public CodeExplorerComponentViewModel(CodeExplorerItemViewModel parent, Declarat
6868
var component = _projectsProvider.Component(qualifiedModuleName);
6969
string parenthesizedName;
7070
using (var properties = component.Properties)
71+
using (var nameProperty = properties["Name"])
7172
{
72-
parenthesizedName = properties["Name"].Value.ToString() ?? string.Empty;
73+
parenthesizedName = nameProperty.Value.ToString() ?? string.Empty;
7374
}
7475

7576
if (ContainsBuiltinDocumentPropertiesProperty())
@@ -113,7 +114,16 @@ private bool ContainsBuiltinDocumentPropertiesProperty()
113114
var component = _projectsProvider.Component(Declaration.QualifiedName.QualifiedModuleName);
114115
using (var properties = component.Properties)
115116
{
116-
return properties.Any(item => item.Name == "BuiltinDocumentProperties");
117+
foreach (var property in properties)
118+
using(property)
119+
{
120+
if (property.Name == "BuiltinDocumentProperties")
121+
{
122+
return true;
123+
}
124+
}
125+
126+
return false;
117127
}
118128
}
119129

Rubberduck.Core/Properties/Settings.Designer.cs

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Rubberduck.Core/UI/Command/ExportAllCommand.cs

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
using NLog;
44
using Rubberduck.VBEditor.SafeComWrappers.Abstract;
55
using Rubberduck.Navigation.CodeExplorer;
6-
using Rubberduck.UI.CodeExplorer.Commands;
76
using Rubberduck.Resources;
87
using Rubberduck.VBEditor.SafeComWrappers;
98

@@ -32,17 +31,32 @@ protected override bool EvaluateCanExecute(object parameter)
3231
return false;
3332
}
3433

35-
var projectNode = parameter as CodeExplorerProjectViewModel;
36-
37-
var project = parameter as IVBProject;
38-
39-
return Evaluate(projectNode?.Declaration.Project ?? project ?? _vbe.ActiveVBProject);
34+
switch (parameter)
35+
{
36+
case CodeExplorerProjectViewModel projectNode:
37+
return Evaluate(projectNode.Declaration.Project);
38+
case IVBProject project:
39+
return Evaluate(project);
40+
}
4041

42+
using (var activeProject = _vbe.ActiveVBProject)
43+
{
44+
return Evaluate(activeProject);
45+
}
4146
}
4247

4348
private bool Evaluate(IVBProject project)
4449
{
45-
return project != null && !project.IsWrappingNullReference && project.VBComponents.Count > 0;
50+
if (project == null || project.IsWrappingNullReference)
51+
{
52+
return false;
53+
}
54+
55+
using (var compontents = project.VBComponents)
56+
{
57+
return compontents.Count > 0;
58+
}
59+
4660
}
4761

4862
protected override void OnExecute(object parameter)

Rubberduck.Core/UI/Command/FindAllReferencesCommand.cs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -192,24 +192,24 @@ private Declaration FindTarget(object parameter)
192192
return declaration;
193193
}
194194

195-
bool findDesigner;
196195
using (var activePane = _vbe.ActiveCodePane)
197196
{
197+
bool findDesigner;
198198
using (var selectedComponent = _vbe.SelectedVBComponent)
199199
{
200-
findDesigner = activePane != null && !activePane.IsWrappingNullReference
201-
&& (selectedComponent?.HasDesigner ?? false);
200+
findDesigner = activePane != null && !activePane.IsWrappingNullReference
201+
&& (selectedComponent?.HasDesigner ?? false);
202202
}
203-
}
204203

205-
return findDesigner
206-
? FindFormDesignerTarget()
207-
: FindCodePaneTarget();
204+
return findDesigner
205+
? FindFormDesignerTarget()
206+
: FindCodePaneTarget(activePane);
207+
}
208208
}
209209

210-
private Declaration FindCodePaneTarget()
210+
private Declaration FindCodePaneTarget(ICodePane codePane)
211211
{
212-
return _state.FindSelectedDeclaration(_vbe.ActiveCodePane);
212+
return _state.FindSelectedDeclaration(codePane);
213213
}
214214

215215
private Declaration FindFormDesignerTarget(QualifiedModuleName? qualifiedModuleName = null)

Rubberduck.Core/UI/Command/IndentCurrentProjectCommand.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,11 @@ public IndentCurrentProjectCommand(IVBE vbe, IIndenter indenter, RubberduckParse
2323

2424
protected override bool EvaluateCanExecute(object parameter)
2525
{
26-
return !_vbe.ActiveVBProject.IsWrappingNullReference && _vbe.ActiveVBProject.Protection != ProjectProtection.Locked;
26+
using (var vbProject = _vbe.ActiveVBProject)
27+
{
28+
return !vbProject.IsWrappingNullReference &&
29+
vbProject.Protection != ProjectProtection.Locked;
30+
}
2731
}
2832

2933
protected override void OnExecute(object parameter)

Rubberduck.Core/UI/Command/MenuItems/CommandBars/AppCommandBarBase.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,7 @@ private void child_Click(object sender, CommandBarButtonClickEventArgs e)
224224
ICommandMenuItem item;
225225
try
226226
{
227-
item = _items.Select(kvp => kvp.Key).SingleOrDefault(menu => menu.GetType().FullName == e.Control.Tag);
227+
item = _items.Select(kvp => kvp.Key).SingleOrDefault(menu => menu.GetType().FullName == e.Tag);
228228
}
229229
catch (COMException exception)
230230
{
@@ -236,7 +236,7 @@ private void child_Click(object sender, CommandBarButtonClickEventArgs e)
236236
return;
237237
}
238238

239-
Logger.Debug("({0}) Executing click handler for commandbar item '{1}', hash code {2}", GetHashCode(), e.Control.Caption, e.Control.Target.GetHashCode());
239+
Logger.Debug("({0}) Executing click handler for commandbar item '{1}', hash code {2}", GetHashCode(), e.Caption, e.TargetHashCode);
240240
item.Command.Execute(null);
241241
}
242242
}

Rubberduck.Core/UI/Command/MenuItems/ParentMenus/ParentMenuItemBase.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -181,13 +181,13 @@ private ICommandBarControl InitializeChildControl(ICommandMenuItem item)
181181

182182
private void child_Click(object sender, CommandBarButtonClickEventArgs e)
183183
{
184-
var item = _items.Select(kvp => kvp.Key).SingleOrDefault(menu => e.Control.Tag.EndsWith(menu.GetType().Name)) as ICommandMenuItem;
184+
var item = _items.Select(kvp => kvp.Key).SingleOrDefault(menu => e.Tag.EndsWith(menu.GetType().Name)) as ICommandMenuItem;
185185
if (item == null)
186186
{
187187
return;
188188
}
189189

190-
Logger.Debug("({0}) Executing click handler for menu item '{1}', hash code {2}", GetHashCode(), e.Control.Caption, e.Control.Target.GetHashCode());
190+
Logger.Debug("({0}) Executing click handler for menu item '{1}', hash code {2}", GetHashCode(), e.Caption, e.TargetHashCode);
191191
item.Command.Execute(null);
192192
}
193193
}

Rubberduck.Core/UI/Command/Refactorings/CodePaneRefactorRenameCommand.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ protected override bool EvaluateCanExecute(object parameter)
2626
Declaration target;
2727
using (var activePane = Vbe.ActiveCodePane)
2828
{
29-
if (Vbe.ActiveCodePane == null || activePane.IsWrappingNullReference)
29+
if (activePane == null || activePane.IsWrappingNullReference)
3030
{
3131
return false;
3232
}

0 commit comments

Comments
 (0)