Skip to content

Commit 7f399b3

Browse files
committed
v1.1.5.5 release with ExcelAdvancedDemo and README update
1 parent 8c74674 commit 7f399b3

15 files changed

Lines changed: 758 additions & 41 deletions

ComAutoHelper.cs

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using System.Collections.Generic;
3+
using System.Diagnostics;
34
using System.Linq;
45
using System.Reflection;
56
using System.Runtime.InteropServices;
@@ -90,5 +91,39 @@ public static bool PropertyExists(object comObject, string propertyName)
9091
return false;
9192
}
9293
}
94+
95+
/// <summary>
96+
/// Lekéri az Excel.Application COM objektumhoz tartozó Windows folyamatot (Process).
97+
/// </summary>
98+
/// <param name="excelApp">Az Excel COM objektum.</param>
99+
/// <returns>A hozzá tartozó Process példány.</returns>
100+
/// <exception cref="InvalidOperationException">
101+
/// Ha nem sikerül lekérni az ablak handle-t vagy a folyamatazonosítót.
102+
/// </exception>
103+
/// <example>
104+
/// using System.Diagnostics;
105+
/// ...
106+
/// var proc = ComAutoHelper.GetProcessByExcelHandle(excelApp);
107+
/// Console.WriteLine("Excel PID: " + proc.Id);
108+
/// </example>
109+
/// <returns>
110+
///<c>true</c>, ha a lekérés sikeres volt és az érték típuskompatibilis; különben<c>false</c>.
111+
///</returns>
112+
public static Process? GetProcessByExcelHandle(object excelApp)
113+
{
114+
int hwnd = ComInvoker.GetProperty<int>(excelApp!, "Hwnd", null);
115+
if (hwnd == 0)
116+
throw new InvalidOperationException("Could not retrieve Excel window handle.");
117+
118+
GetWindowThreadProcessId(hwnd, out nint processID);
119+
if (processID == 0)
120+
throw new InvalidOperationException("Could not retrieve Excel process ID.");
121+
122+
return Process.GetProcessById(processID.ToInt32());
123+
}
124+
125+
[System.Runtime.InteropServices.DllImport("user32.dll")]
126+
private static extern uint GetWindowThreadProcessId(int hWnd, out nint lpdwProcessId);
127+
93128
}
94129
}

ComAutoWrapper.csproj

Lines changed: 9 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,26 @@
1-
<Project Sdk="Microsoft.NET.Sdk">
1+
<Project Sdk="Microsoft.NET.Sdk">
22
<PropertyGroup>
33
<TargetFramework>net9.0</TargetFramework>
44
<ImplicitUsings>enable</ImplicitUsings>
55
<Nullable>enable</Nullable>
66
<Platforms>AnyCPU;x64</Platforms>
77
<GeneratePackageOnBuild>False</GeneratePackageOnBuild>
88
<PackageId>ComAutoWrapper</PackageId>
9-
<Version>1.1.5.4</Version>
9+
<Version>1.1.5.7</Version>
1010
<Authors>Ferenc Biro</Authors>
11-
<Company>Saját Fejlesztés</Company>
11+
<Company>Saját Fejlesztés(chatgt segítségével)</Company>
1212
<Description>Minimalista, könnyen használható .NET wrapper COM automatizáláshoz (Excel, Word, stb.). Magas szintű metódusokkal, erőforráskezeléssel és introspekcióval.</Description>
1313
<PackageTags>COM;Interop;Excel;Word;Automation;Wrapper;LateBinding</PackageTags>
14-
<RepositoryUrl>https://github.com/felhasznalo/ComAutoWrapper</RepositoryUrl> <!-- ha van -->
15-
<PackageProjectUrl>https://github.com/felhasznalo/ComAutoWrapper</PackageProjectUrl>
14+
<RepositoryUrl>https://github.com/pmonitor0/ComAutoWrapper</RepositoryUrl> <!-- ha van -->
15+
<RepositoryType>git</RepositoryType>
16+
<PackageProjectUrl>https://github.com/pmonitor0/ComAutoWrapper</PackageProjectUrl>
1617
<PackageReadmeFile>Readme.md</PackageReadmeFile>
1718
<PackageLicenseExpression>MIT</PackageLicenseExpression>
1819

19-
<AssemblyVersion>1.1.5.4</AssemblyVersion>
20-
<FileVersion>1.1.5.4</FileVersion>
20+
<AssemblyVersion>1.1.5.7</AssemblyVersion>
21+
<FileVersion>1.1.5.7</FileVersion>
2122
<!-- XML dokumentáció NuGet csomagba -->
22-
<IncludeSymbols>true</IncludeSymbols>
23+
<IncludeSymbols>False</IncludeSymbols>
2324
<IncludeSource>true</IncludeSource>
2425
<EmbedUntrackedSources>true</EmbedUntrackedSources>
2526
</PropertyGroup>
@@ -51,12 +52,4 @@
5152
<PackagePath>\</PackagePath>
5253
</None>
5354
</ItemGroup>
54-
55-
<!-- <ItemGroup>
56-
<None Update="Readme.md">
57-
<Pack>True</Pack>
58-
<PackagePath>\</PackagePath>
59-
</None>
60-
</ItemGroup>
61-
-->
6255
</Project>

ComReleaseHelper.cs

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ public static T Track<T>(T comObject)
2828
{
2929
_tracked.Add(comObject!);
3030
}
31-
31+
3232
return comObject;
3333
}
3434

@@ -38,11 +38,12 @@ public static T Track<T>(T comObject)
3838
/// </summary>
3939
public static void ReleaseAll()
4040
{
41-
foreach (var obj in _tracked)
41+
#pragma warning disable CA1416
42+
foreach (object obj in _tracked)
4243
{
4344
try
4445
{
45-
Marshal.FinalReleaseComObject(obj);
46+
Marshal.FinalReleaseComObject(obj!);
4647
}
4748
catch
4849
{
@@ -73,5 +74,31 @@ public static void DebugList()
7374
Console.WriteLine($"Tracked: {o?.GetType()}");
7475
}
7576
}
77+
78+
/// <summary>
79+
/// Eltávolít egy adott COM objektumot a követett listából, ha benne van.
80+
/// </summary>
81+
/// <param name="comObject">A COM objektum, amelyet törölni szeretnél.</param>
82+
/// <returns><c>true</c>, ha sikerült eltávolítani.</returns>
83+
public static bool Remove(object comObject)
84+
{
85+
return _tracked.Remove(comObject);
86+
}
87+
88+
/// <summary>
89+
/// Felszabadítja az összes COM objektumot, majd kiüríti a listát.
90+
/// </summary>
91+
public static void Reset()
92+
{
93+
ReleaseAll();
94+
_tracked.Clear();
95+
}
96+
/// <summary>
97+
/// Megvizsgálja, hogy a megadott COM objektum jelen van-e a nyilvántartásban.
98+
/// </summary>
99+
public static bool IsTracked(object comObject)
100+
{
101+
return _tracked.Contains(comObject);
102+
}
76103
}
77104
}

ComRotHelper.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ public static List<object> GetExcelApplications()
5757
// Csak akkor adjuk hozzá, ha még nem szerepel a listában (referencia szerint)
5858
if (!result.Any(o => ReferenceEquals(o, app)))
5959
{
60-
result.Add(app);
60+
result.Add(app!);
6161
}
6262
}
6363
}
File renamed without changes.
Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,8 @@ public static void SelectUsedRange(object worksheet)
2828
public static void HighlightUsedRange(object worksheet, int color)
2929
{
3030
SelectUsedRange(worksheet);
31-
var usedRange = ComInvoker.GetProperty<object>(worksheet, "UsedRange");
32-
var interior = ComInvoker.GetProperty<object>(usedRange, "Interior");
31+
object? usedRange = ComInvoker.GetProperty<object>(worksheet, "UsedRange");
32+
object? interior = ComInvoker.GetProperty<object>(usedRange!, "Interior");
3333
ComInvoker.SetProperty(interior!, "Color", color);
3434
}
3535

@@ -50,13 +50,13 @@ public static void SelectCells(object sheet, params string[] addresses)
5050
.Select(addr => ComInvoker.GetProperty<object>(sheet, "Range", new object[] { addr }))
5151
.ToArray();
5252

53-
object combined = ranges[0];
53+
object? combined = ranges[0];
5454
for (int i = 1; i < ranges.Length; i++)
5555
{
56-
combined = ComInvoker.CallMethod<object>(app, "Union", combined, ranges[i]);
56+
combined = ComInvoker.CallMethod<object>(app!, "Union", combined!, ranges[i]!);
5757
}
5858

59-
ComInvoker.CallMethod(combined, "Select");
59+
ComInvoker.CallMethod(combined!, "Select");
6060
}
6161

6262
/// <summary>
@@ -66,24 +66,24 @@ public static void SelectCells(object sheet, params string[] addresses)
6666
/// <returns>A kiválasztott cellák listája sor és oszlop szerint (<c>Row</c>, <c>Column</c>).</returns>
6767
public static List<(int Row, int Column)> GetSelectedCellCoordinates(object excel)
6868
{
69-
var coordinates = new List<(int Row, int Column)>();
69+
List<(int, int)> coordinates = new List<(int Row, int Column)>();
7070

71-
var selection = ComInvoker.GetProperty<object>(excel, "Selection");
72-
var areas = ComInvoker.GetProperty<object>(selection!, "Areas");
71+
object? selection = ComInvoker.GetProperty<object>(excel, "Selection");
72+
object? areas = ComInvoker.GetProperty<object>(selection!, "Areas");
7373
int areaCount = ComInvoker.GetProperty<int>(areas!, "Count");
7474

7575
for (int a = 1; a <= areaCount; a++)
7676
{
77-
var area = ComInvoker.GetProperty<object>(areas!, "Item", new object[] { a });
77+
object? area = ComInvoker.GetProperty<object>(areas!, "Item", new object[] { a });
7878
var cellsInArea = ComInvoker.GetProperty<object>(area!, "Cells");
7979
int count = ComInvoker.GetProperty<int>(cellsInArea!, "Count");
8080

8181
for (int i = 1; i <= count; i++)
8282
{
83-
var cell = ComInvoker.GetProperty<object>(cellsInArea!, "Item", new object[] { i });
84-
string address = ComInvoker.GetProperty<string>(cell!, "Address");
83+
object? cell = ComInvoker.GetProperty<object>(cellsInArea!, "Item", new object[] { i });
84+
string? address = ComInvoker.GetProperty<string>(cell!, "Address");
8585

86-
var match = Regex.Match(address, @"\$([A-Z]+)\$(\d+)");
86+
Match match = Regex.Match(address!, @"\$([A-Z]+)\$(\d+)");
8787
if (match.Success)
8888
{
8989
string colLetter = match.Groups[1].Value;
@@ -105,28 +105,28 @@ public static void SelectCells(object sheet, params string[] addresses)
105105
public static List<(int Row, int Column, object Cell)> GetSelectedCellObjects(object excel)
106106
{
107107
var result = new List<(int Row, int Column, object Cell)>();
108-
var selection = ComInvoker.GetProperty<object>(excel, "Selection");
109-
var areas = ComInvoker.GetProperty<object>(selection!, "Areas");
108+
object? selection = ComInvoker.GetProperty<object>(excel, "Selection");
109+
object? areas = ComInvoker.GetProperty<object>(selection!, "Areas");
110110
int areaCount = ComInvoker.GetProperty<int>(areas!, "Count");
111111

112112
for (int a = 1; a <= areaCount; a++)
113113
{
114-
var area = ComInvoker.GetProperty<object>(areas!, "Item", new object[] { a });
115-
var cellsInArea = ComInvoker.GetProperty<object>(area!, "Cells");
114+
object? area = ComInvoker.GetProperty<object>(areas!, "Item", new object[] { a });
115+
object? cellsInArea = ComInvoker.GetProperty<object>(area!, "Cells");
116116
int count = ComInvoker.GetProperty<int>(cellsInArea!, "Count");
117117

118118
for (int i = 1; i <= count; i++)
119119
{
120-
var cell = ComInvoker.GetProperty<object>(cellsInArea!, "Item", new object[] { i });
121-
string address = ComInvoker.GetProperty<string>(cell!, "Address");
120+
object? cell = ComInvoker.GetProperty<object>(cellsInArea!, "Item", new object[] { i });
121+
string? address = ComInvoker.GetProperty<string>(cell!, "Address");
122122

123-
var match = Regex.Match(address, @"\$([A-Z]+)\$(\d+)");
123+
Match match = Regex.Match(address!, @"\$([A-Z]+)\$(\d+)");
124124
if (match.Success)
125125
{
126126
string colLetter = match.Groups[1].Value;
127127
int row = int.Parse(match.Groups[2].Value);
128128
int col = ColumnLetterToNumber(colLetter);
129-
result.Add((row, col, cell));
129+
result.Add((row!, col!, cell!));
130130
}
131131
}
132132
}

Readme.md

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,42 @@ ComReleaseHelper.Track(doc);
117117
ComReleaseHelper.Track(documents);
118118
ComReleaseHelper.Track(wordApp);
119119
ComReleaseHelper.ReleaseAll();
120+
121+
---
122+
123+
🧹 ComReleaseHelper – Új metódusok WPF / hosszú életciklusú alkalmazásokhoz
124+
A ComReleaseHelper feladata a COM objektumok nyomon követése és biztonságos felszabadítása. Az alábbi új metódusok lehetővé teszik a dinamikusabb kezelését is (pl. WPF UI esetén):
125+
126+
Metódus Leírás
127+
Track(object obj) Hozzáadja a COM objektumot a felszabadítandók listájához.
128+
ReleaseAll() Felszabadítja az összes nyomon követett COM objektumot.
129+
Clear() Ürít minden nyilvántartott objektumot felszabadítás nélkül.
130+
Reset() Teljes újraindítás: először ReleaseAll(), majd Clear().
131+
Remove(object obj) Eltávolít egy konkrét objektumot a nyomon követésből.
132+
IsTracked(object obj) Igaz értéket ad vissza, ha az adott objektum épp nyomon van követve.
133+
134+
Példák
135+
csharp
136+
var range = ExcelHelper.GetRange(sheet, "A1:B2");
137+
ComReleaseHelper.Track(range);
138+
139+
// ... felhasználás után mégsem kell menteni vagy felszabadítani:
140+
ComReleaseHelper.Remove(range); // nem lesz felszabadítva
141+
142+
// Teljes lista törlése, de nem hív ReleaseComObject-et:
143+
ComReleaseHelper.Clear();
144+
145+
// Biztonságos újrakezdés (felszabadítással együtt):
146+
ComReleaseHelper.Reset();
147+
148+
// Ellenőrzés:
149+
bool isTracked = ComReleaseHelper.IsTracked(range);
150+
⚠️ Figyelem:
151+
A Clear() nem hívja meg a Marshal.FinalReleaseComObject-et – csak eltávolítja az objektumokat a listából.
152+
A Reset() viszont előbb felszabadít, majd ürít is.
153+
154+
155+
120156
🔐 License
121157
MIT License
122158
Szabadon használható oktatási és üzleti célra is.

0 commit comments

Comments
 (0)