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ł: 1292 razy
Posty: 2625
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ł: 82 razy
Posty: 482
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.
_________________
Częstym błędem jest zakładanie, że autorzy niezrozumiałego kodu będą w jakiś sposób potrafili wyrazić się jasno i klarownie w komentarzach. Kevlin Henney
ID posta: 433663 Skopiuj do schowka
 
 
master_mix 
Excel Expert



Wersja: Win Office 365
Pomógł: 1292 razy
Posty: 2625
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ł: 82 razy
Posty: 482
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
_________________
Częstym błędem jest zakładanie, że autorzy niezrozumiałego kodu będą w jakiś sposób potrafili wyrazić się jasno i klarownie w komentarzach. Kevlin Henney
ID posta: 433708 Skopiuj do schowka
 
 
master_mix 
Excel Expert



Wersja: Win Office 365
Pomógł: 1292 razy
Posty: 2625
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ł: 1292 razy
Posty: 2625
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 8 raz(y) 163.04 KB

Właściwości projektu.jpg
Plik ściągnięto 7 raz(y) 83.34 KB

Właściwości projektu 2.jpg
Plik ściągnięto 8 raz(y) 96.73 KB

folderDLL.png
Plik ściągnięto 6 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
 
 
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