ID tematu: 75569
 |
Własne Biblioteki dll dla VBA - Model COM |
Autor |
Wiadomość |
master_mix
Excel Expert


Wersja: Win Office 365
Pomógł: 1293 razy Posty: 2637
|
Wysłany: 15-02-2024, 02:28 Własne Biblioteki dll dla VBA - Model COM
|
|
|
Cześć
Jako że od czasu do czasu zdarzają się pytania i problemy które ciężko rozwiązać w VBA
(ostatnio Rafał B. - odnośnie drukowania pdf mnie natchnął), proponuję czasami inne platformy programistyczne.
Warto wiedzieć że oprócz VSTO, jest jeszcze model COM, który często może się wydawać poręczniejszy i bardziej przyjazny dla rozwiązania problemu.
W związku z tym nagrałem (niestety przydługi) filmik, który przybliża choć trochę technikę napisania własnego obiektu COM
LINK
p.s.
Niestety strasznie powolną maszynę miałem dzisiaj do dyspozycji i zasmarkany jestem. Poza tym nie robię kariery YouTube'ra więc nie zdziwię się jak ktoś przyśnie podczas filmu :)
Ale nagrywać ponownie mi się nie che |
_________________
Podejmę współpracę (pracę)
Programowanie C#, Android, iOS, VB.NET, VBA, ASP.NET Core, WPF, Xamarin, Power Platforms, XAML, MVC, LINQ, Entity Framework. Bazy danych SQL Server, Oracle, MySQL, Firebird
Wrocław i okolice …lub zdalnie. |
|
 | ID posta:
433632
|
|
|
 |
|
|
|
Rafał B.
ExcelSpec


Wersja: Win Office 2021
Pomógł: 91 razy Posty: 514
|
Wysłany: 15-02-2024, 21:11
|
|
|
Ależ uczta! Lecę po jakieś dobre piwo i oglądam. W końcu dowiem się co to ten mityczny interfejs IUnknown
Jak to żartobliwie mawia mój Przyjaciel: "szopy z głów!" Dam feedback, ale na pewno jakiś czas upłynie, zanim zrozumiem co i jak.
Ostatnio piszę jakieś pierwsze trywialne dodatki VSTO (też na stacku C# + .NET w Visual Studio), ale taka wiedza to też skarb, żeby kompleksowo ogarniać tematy około VBA.
Dzięki za poświęcony czas i bardzo doceniam, na pewno nie tylko ja. |
_________________ W erze zaawansowanych narzędzi LLM takich jak GPT 50% problemów użytkowników forum może być efektywnie rozwiązanych przez nich samych za pomocą tych narzędzi. Jednak często bardziej cenią swój czas niż czas tych, którzy oferują tutaj pomoc. |
|
 | ID posta:
433663
|
|
|
 |
|
|
master_mix
Excel Expert


Wersja: Win Office 365
Pomógł: 1293 razy Posty: 2637
|
Wysłany: 15-02-2024, 21:31
|
|
|
Rafał B. napisał/a: | Lecę po jakieś dobre piwo i oglądam |
Dzisiaj przeglądałem filmik, i oczywiście wpadka jest :)
Przy interfejsie IDispatch lub dual jeżeli zmieniamy atrybut [ProgID] -> to oczywiście on dotyczy klas a nie interfejsu, w związku z tym powinien być nad deklaracją klasy.
Ale tak jak mówiłem nie polecam IDispatch ani Dual (MS też nie poleca), są tylko kłopoty.
Rafał B. napisał/a: | Ostatnio piszę jakieś pierwsze trywialne dodatki VSTO |
Chodź bardzo rzadko robię coś po excela, to ja jednak częściej wybieram COM, bo nie są potrzebne żadne instalki, co w wielu firmach może być zaletą w związku z tym że polityki IT tych firm są rygorystyczne i nie pozwalają instalować "zewnętrznych" aplikacji |
_________________
Podejmę współpracę (pracę)
Programowanie C#, Android, iOS, VB.NET, VBA, ASP.NET Core, WPF, Xamarin, Power Platforms, XAML, MVC, LINQ, Entity Framework. Bazy danych SQL Server, Oracle, MySQL, Firebird
Wrocław i okolice …lub zdalnie. |
|
 | ID posta:
433665
|
|
|
 |
|
|
Rafał B.
ExcelSpec


Wersja: Win Office 2021
Pomógł: 91 razy Posty: 514
|
Wysłany: 17-02-2024, 21:01
|
|
|
Jak udowodniłem w wątku z obsługą PDF: opis master_miksa jest bardzo dokładny i wyczerpujący w tutorialu, wystarczający w zupełności do napisania jakiegoś prostego rozwiązania nawet przez kompletnego laika w temacie COM i to jest najważniejsze
Jedyny malutki problem mam nieco ze zrozumieniem części teoretycznej - np. na slajdach pojawia się określenie `relacja (nie)zarządzana`, które jest dla mnie niejasne i gugiel też nie pomógł. Ale może z czasem lepiej też zrozumiem działanie od strony koncepcyjnej.
Gdyby Kolegę dopadła kiedyś nuda to może warto też opisać jak debugować pisanie takiego dodatku COM, żeby cały czas tego hosta (u mnie Excel) nie uruchamiać po każdej rekompilacji. Robiłem to w ten niezbyt wydajny sposób, ale przy większej bibliotece byłoby to bardzo kłopotliwe.
Super sprawa, dostępność tysięcy bibliotek .NETowych w tym rozwiązaniu, to ogromne zwiększenie praktycznych możliwości VBA.
Edycja
jednak jeden problem wyszedł: po podpięciu referencji na innym komputerze otrzymuję Runtime 429 - ActiveX component can't create object. Czy musżę zarejestrować DLLkę na tym serwerze? Bo coś Kolega zwracał uwagę, że to zaleta nad VSTO, że nie potrzebuje admina, a tutaj mi jakimś błędem sypie |
_________________ W erze zaawansowanych narzędzi LLM takich jak GPT 50% problemów użytkowników forum może być efektywnie rozwiązanych przez nich samych za pomocą tych narzędzi. Jednak często bardziej cenią swój czas niż czas tych, którzy oferują tutaj pomoc. |
|
 | ID posta:
433708
|
|
|
 |
|
|
master_mix
Excel Expert


Wersja: Win Office 365
Pomógł: 1293 razy Posty: 2637
|
Wysłany: 18-02-2024, 03:14
|
|
|
Odpowiedzi na Twoje pytania (oprócz tego błędu 429)
FILM CZ.2
co do błędu.
Czy po kompilacji masz dodatkowe *.dll dla tego nuget'a?
(na 100% chodzi o niego - iTextSharp. sprawdzę go w wolnej chwili)
Możesz podesłać na priv pliki po kompilacji ?
p.s.
Na filmie zapomniałem dodać że
są niejawne deklaracje ale na poziomie lokalnym metody "var"
z tym że różnią się od Variant tym że nie mogą zmieniać typu już choć raz przypisanego.
Czyli nie można:
Kod: | var zmienna = "jakiś tekst";
zmienna = 123; |
|
_________________
Podejmę współpracę (pracę)
Programowanie C#, Android, iOS, VB.NET, VBA, ASP.NET Core, WPF, Xamarin, Power Platforms, XAML, MVC, LINQ, Entity Framework. Bazy danych SQL Server, Oracle, MySQL, Firebird
Wrocław i okolice …lub zdalnie. |
|
 | ID posta:
433710
|
|
|
 |
|
|
master_mix
Excel Expert


Wersja: Win Office 365
Pomógł: 1293 razy Posty: 2637
|
Wysłany: 18-02-2024, 23:34
|
|
|
Rafał B. napisał/a: | jednak jeden problem wyszedł: po podpięciu referencji na innym komputerze otrzymuję Runtime 429 - ActiveX component can't create object. |
Przepraszam ale wprowadziłem Was w błąd - Nieświadomie -
Od dawne nie pisałem już com-ów, tylko apki, i wzorując się na aplikacjach framework, powiedziałem że wystarczy pliki przenieść na kompa klienta.
Niestety jest inaczej niż jak dla aplikacji, otórz:
Trzeba te COM'y rejestrować na kliencie.
Najpierw należy podpisać projekt silną nazwą - nie wymagane, ale zalecane (Właściwości projektu.jpg - inaczej pokaże ostrzeżenie że mogą być konflikty nazwy)
Nie wybieramy żadnej platformy docelowej (32,64 bit) (Właściwości projektu 2.jpg)
I należy zarejestrować COM'a na platformy (CMD.jpg)
- na żółto zaznaczyłem dla 32bit, niebieski 64 bit
Konsolę należy niestety uruchomić z admina
Zarejestrować :
32bit
Kod: | C:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe /tlb /codebase "C:\Excel Forum File\ExcelForumProject\bin\Debug\ExcelForumProject.dll" |
64bit
Kod: | C:\Windows\Microsoft.NET\Framework64\v4.0.30319\RegAsm.exe /tlb /codebase "C:\Excel Forum File\ExcelForumProject\bin\Debug\ExcelForumProject.dll" |
p.s.
W przypadku NuGet'ów, jeżeli utworza się dodatkowe *.dll, może ale nie musi być konieczność zarejestrowania tych *.dll
EDIT:
Aby ułatwić rejestrację takich bibliotek (choć wydaje mi się to mało skomplikowana), można wykorzystać poniższy skrypt *.vbs
1. Taki skrypt umieszczamy w tym samym folderze co skompilowane nasze biblioteki.
2. Cały folder przenosimy na maszynę docelową.
3. Uruchamiamy skrypt i podajemy tylko samą nazwę pliku np: mojaDllka.dll
(folderDLL.png)
Kod: |
Const sINSTALLER = "Installer"
If Not WScript.Arguments.Named.Exists("elevate") Then
MsgBox "On the next screen, please provide permission for this script to make changes to your device", , sINSTALLER
CreateObject("Shell.Application").ShellExecute WScript.FullName _
, """" & WScript.ScriptFullName & """ /elevate", "", "runas", 0
WScript.Quit
End If
Dim sFILE_NAME
sFILE_NAME = InputBox("Enter the name of the *.dll file, e.g: MyLib.dll")
If sFILE_NAME = "" Then
MsgBox "No file name provided", , sINSTALLER
WScript.Quit
End If
bitness = OfficeBitness
If bitness = 64 Then
sRegAsmPath = "C:\Windows\Microsoft.NET\Framework64\v4.0.30319\regasm"
Else
sRegAsmPath = "C:\Windows\Microsoft.NET\Framework\v4.0.30319\regasm"
End If
res = MsgBox("Select" & vbNewLine & "* 'Yes' to install/update" & vbNewLine & "* 'No' to uninstall" & vbNewLine & "* 'Cancel' to cancel", vbYesNoCancel + vbQuestion + vbSystemModal, sINSTALLER)
If res = vbCancel Then
MsgBox "Cancelled", , sINSTALLER
WScript.Quit
End If
Set wshShell = WScript.CreateObject("WScript.Shell")
sFilePath = """" & GetScriptFolder & "\" & sFILE_NAME & """"
If res = vbYes Then
Set oExec = wshShell.Exec(sRegAsmPath & " /codebase /tlb " & sFilePath)
Do While oExec.Status = 0
WScript.Sleep 100
Loop
If oExec.ExitCode = 0 then
MsgBox "Successfully installed/updated (" & bitness & " bit)", , sINSTALLER
Else
MsgBox "Install/update failed (" & bitness & " bit)" & vbNewLine & vbNewLine & oExec.StdErr.ReadAll(), , sINSTALLER
End If
Else
Set oExec = wshShell.Exec(sRegAsmPath & " /unregister /tlb " & sFilePath)
Do While oExec.Status = 0
WScript.Sleep 100
Loop
If oExec.ExitCode = 0 then
MsgBox "Successfully uninstalled (" & bitness & " bit)", , sINSTALLER
Else
MsgBox "Uninstall failed (" & bitness & " bit)" & vbNewLine & vbNewLine & oExec.StdErr.ReadAll(), , sINSTALLER
End If
End If
Set wshShell = Nothing
Set oExec = Nothing
' Get the folder this VBScript file is within (note: without trailing '\')
Function GetScriptFolder()
Dim objFSO, objFile
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.GetFile(Wscript.ScriptFullName)
GetScriptFolder = objFSO.GetParentFolderName(objFile)
Set objFSO = Nothing
Set objFile = Nothing
End Function
' Get the bitness of Office
Function OfficeBitness()
Dim Excel
Set Excel = CreateObject("Excel.Application")
Excel.Visible = False
If InStr(Excel.OperatingSystem,"64") > 0 Then
OfficeBitness = 64
Else
OfficeBitness = 32
End if
Excel.Quit
Set Excel = Nothing
End Function
|
W skrypcie wystarczy zmienić
Kod: | Dim sFILE_NAME
sFILE_NAME = InputBox("Enter the name of the *.dll file, e.g: MyLib.dll")
If sFILE_NAME = "" Then
MsgBox "No file name provided", , sINSTALLER
WScript.Quit
End If |
Na
Kod: |
Const sFILE_NAME = "ExcelForumProject.dll"
|
I mamy "instalator"
EDIT2:
Dzisiaj kolega z działu przypomniał mi jak to robiliśmy:
Ja wrzucałem dll'ki w ustaloną lokalizację sieciową.
On puszczał rejestrację na maszynach przez GPO
CMD.jpg
|
 |
Plik ściągnięto 13 raz(y) 163.04 KB |
Właściwości projektu.jpg
|
 |
Plik ściągnięto 16 raz(y) 83.34 KB |
Właściwości projektu 2.jpg
|
 |
Plik ściągnięto 12 raz(y) 96.73 KB |
folderDLL.png
|
 |
Plik ściągnięto 9 raz(y) 28.1 KB |
|
_________________
Podejmę współpracę (pracę)
Programowanie C#, Android, iOS, VB.NET, VBA, ASP.NET Core, WPF, Xamarin, Power Platforms, XAML, MVC, LINQ, Entity Framework. Bazy danych SQL Server, Oracle, MySQL, Firebird
Wrocław i okolice …lub zdalnie. |
|
 | ID posta:
433724
|
|
|
 |
|
|
Rafał B.
ExcelSpec


Wersja: Win Office 2021
Pomógł: 91 razy Posty: 514
|
Wysłany: 25-08-2024, 19:32
|
|
|
Dość mało programistów w naszym środowisku zajmuje się tworzeniem własnych bibliotek, ale jeśli zbierze się 2-3 zainteresowanych, to przedstawię rozwiązanie (na zasadzie proof-of-concept) łączące zalety powyższego rozwiązania szefa master_mix z innymi zaletami m.in. przede wszystkim z brakiem potrzeby ręcznego rejestrowania .DLLki -czyli bez potrzeby posiadania uprawnień administratora (lub obejść, jak zaprezentowane powyżej z udostępnioną lokalizacją).
Jak ktoś chce sam grzebać to podaję słowa-klucze pomagajace znaleźć rozwiązanie samodzielnie: dodatek do Excela typu .XLL + Excel-DNA. Fantastyczna sprawa, praktycznie nie mamy ograniczeń, przynajmniej na Windows; korzystamy z benefitów .NET bez żadnych dodatkowych restrykcji, kiedy nam czysta biblioteka standardowa VBA nie wystarcza.
---
Tak na marginesie: ciekawe kto kojarzy czym jest C API dla Excela :) piszę te kilka lat kod w VBA, grube setki tysięcy linii kodu napisane, przeczytane dziesiątki tysięcy postów po forach, setki pełnoprawnych artykułów o kodowaniu w Excelu, a o C API dowiaduję się przypadkiem kilka dni temu. Więc jest to bez wątpienia wiedza dość hermetyczna w naszym środowisku, a niezwykle interesująca, szczególnie dla tych bardziej doświadczonych i świadomych programistów VBA. |
_________________ W erze zaawansowanych narzędzi LLM takich jak GPT 50% problemów użytkowników forum może być efektywnie rozwiązanych przez nich samych za pomocą tych narzędzi. Jednak często bardziej cenią swój czas niż czas tych, którzy oferują tutaj pomoc. |
|
 | ID posta:
436774
|
|
|
 |
|
|
|
Nie możesz pisać nowych tematów Nie możesz odpowiadać w tematach Nie możesz zmieniać swoich postów Nie możesz usuwać swoich postów Nie możesz głosować w ankietach Nie możesz załączać plików na tym forum Możesz ściągać załączniki na tym forum
|
Dodaj temat do Ulubionych Wersja do druku
|
|
Strona uĹźywa plikĂłw cookies.
Kliknij tutaj, Ĺźeby dowiedzieÄ siÄ jaki jest cel uĹźywania cookies oraz jak zmieniÄ ustawienia cookie w przeglďż˝darce.
KorzystajÄ
c ze strony uĹźytkownik wyraĹźa zgodÄ na uĹźywanie plikĂłw cookies, zgodnie z bieĹźÄ
cymi ustawieniami przeglÄ
darki.
SprawdĹş, w jaki sposĂłb przetwarzamy dane osobowe
|