Excel Forum - Porady, Pomoc,  Excel Help, Excel FAQ Strona Główna
 FAQ  RegulaminRegulamin  Szukaj   Użytkownicy   Grupy   Rejestracja   Profil   Twoje wiadomości   Zaloguj 


Poprzedni temat «» Następny temat
ID tematu: 75569 Skopiuj do schowka 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 :mrgreen:
_________________

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 Skopiuj do schowka
 
 
Rafał B. 
ExcelSpec



Wersja: Win Office 2021
Pomógł: 91 razy
Posty: 514
Wysłany: 15-02-2024, 21:11   

:shock: Ależ uczta! Lecę po jakieś dobre piwo i oglądam. W końcu dowiem się co to ten mityczny interfejs IUnknown :clap

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 Skopiuj do schowka
 
 
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

:beer

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 Skopiuj do schowka
 
 
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 :beer

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 :mrgreen: 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 Skopiuj do schowka
 
 
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 Skopiuj do schowka
 
 
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 Skopiuj do schowka
 
 
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 8-) 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 Skopiuj do schowka
 
 
Wyświetl posty z ostatnich:   
Odpowiedz do tematu
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

Skocz do:  

Powered by phpBB modified by Przemo © 2003 phpBB Group
Theme xandgreen created by spleen& Programosy modified v0.3 by warna
Opieka techniczna www.wip.pl

Archiwum

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