2009-10-15 23 views
10

Kilku użytkowników zgłosiło, że jeśli uruchomią program Excel, klikając dwukrotnie plik Excel, dodatek nie zostanie załadowany. Ale jeśli otwierają Excela za pomocą menu Start (lub paska narzędzi szybkiego uruchamiania), dodatek ładuje się poprawnie.Dodatek COM dla programu Excel nie jest ładowany po uruchomieniu programu Excel przez otwarcie pliku

Niektóre szczegóły, w przypadku gdy pomoc:

  • Jest to dodatek COM, napisane w VB6.
  • Problem został zgłoszony w systemach Windows XP/Excel 2003 i Vista/Excel 2007.
  • Dodatek implementuje IDTExtensibility2.
  • Tryb startu jest ustawiony na "Load on Startup".

Wszelkie przemyślenia na temat przyczyny lub sposobu rozwiązania tego problemu byłyby bardzo mile widziane.

Aktualizacja: Uważam, że znalazłem rozwiązanie tego problemu.

Po zarejestrowaniu biblioteki dll IDTExtensibility2, automatycznie tworzy ona wpisy HKCU dla zachowania obciążenia, nazwy dodatków itp. Ale miałem również mój plik instalacyjny zarejestrować dodatek do HKLM, tak aby był dostępny dla wszyscy użytkownicy na komputerze. Spowodowało to podwójne wpisy rejestru w systemie.

Nie sądziłem, że to będzie przyczyną problemu. Ręcznie edytowałem wpisy HKCU, a Excel wydawał się ignorować je i postępować zgodnie z wpisami HKLM. Otrzymałem jednak od innego programisty wskazówkę, że mają ten sam problem, a ich rozwiązaniem było usunięcie zduplikowanych wpisów w rejestrze. Próbowałem go i wydaje się, że rozwiązał problem dla (bardzo małej liczby) osób, które zgłosiły błąd.

Poniższy kod konfiguracji Inno doda wpisy HKLM, dwukrotnie sprawdzi, czy zachowanie obciążenia jest prawidłowe (ponieważ jestem paranoikiem), a następnie usuń wpis HKCU. Zmień swoje atrybuty plików wszędzie tam, gdzie zobaczysz WSZYSTKIE KAPUŁY.

[Registry] 
Root: HKLM; Subkey: Software\Microsoft\Office\Excel\Addins\CONNECT_CLASS; Flags: uninsdeletekey 
Root: HKLM; Subkey: Software\Microsoft\Office\Excel\Addins\CONNECT_CLASS; ValueType: string; ValueName: FriendlyName; ValueData: ADDIN_NAME 
Root: HKLM; Subkey: Software\Microsoft\Office\Excel\Addins\CONNECT_CLASS; ValueType: string; ValueName: Description; ValueData: ADDIN_DESC 
Root: HKLM; Subkey: Software\Microsoft\Office\Excel\Addins\CONNECT_CLASS; ValueType: dword; ValueName: LoadBehavior; ValueData: 3 
Root: HKLM; Subkey: Software\Microsoft\Office\Excel\Addins\CONNECT_CLASS; ValueType: dword; ValueName: CommandLineSafe; ValueData: 0 


// Set load behavior to on start up 
procedure ResetAddinRegKeys(); 
var 
    bUpdate : Boolean; 
    LoadBehaviorKey : Cardinal; 

begin 
    if RegQueryDWordValue(HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\Office\Excel\Addins\CONNECT_CLASS', 'LoadBehavior', LoadBehaviorKey) then begin 
    if LoadBehaviorKey <> 3 then begin 
     bUpdate := True; 
    end; 
    end else begin 
    bUpdate := True; 
    end; 

    if bUpdate = True then begin 
    RegWriteDWordValue(HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\Office\Excel\Addins\CONNECT_CLASS','LoadBehavior', 3); 
    end; 

    if RegKeyExists(HKEY_CURRENT_USER, 'SOFTWARE\Microsoft\Office\Excel\Addins\CONNECT_CLASS') then begin 
    if RegDeleteKeyIncludingSubkeys(HKEY_CURRENT_USER, 'SOFTWARE\Microsoft\Office\Excel\Addins\CONNECT_CLASS') then begin; 
     //MsgBox('Duplicate keys deleted', mbInformation, MB_OK); 
    end; 
    end; 
end; 

function GetCustomSetupExitCode: Integer; 
begin 
    ResetAddinRegKeys; 
    Result := 0; 
end; 

Dla mojego instalatora MSI, mam sekcję popełnienia instalacji wywołać następujący VBScript:

Sub RemoveAddinHKCUKeys() 
    On Error Resume Next 
    Dim WshShell 
    Set WshShell = WScript.CreateObject("WScript.Shell") 

    WshShell.RegDelete "HKCU\SOFTWARE\Microsoft\Office\Excel\Addins\CONNECT_CLASS\CommandLineSafe" 
    WshShell.RegDelete "HKCU\SOFTWARE\Microsoft\Office\Excel\Addins\CONNECT_CLASS\Description" 
    WshShell.RegDelete "HKCU\SOFTWARE\Microsoft\Office\Excel\Addins\CONNECT_CLASS\FriendlyName" 
    WshShell.RegDelete "HKCU\SOFTWARE\Microsoft\Office\Excel\Addins\CONNECT_CLASS\LoadBehavior" 
    WshShell.RegDelete "HKCU\SOFTWARE\Microsoft\Office\Excel\Addins\CONNECT_CLASS\" 

    If Err.Number <> 0 The Err.Clear 
End Sub 

Odpowiedz

3

To było dawno, więc moja pamięć jest mglisty, ale ja pamiętam problemy z uzyskaniem Dodatki COM do uruchomienia, jeśli host (Excel, Word) jest uruchamiany jako obiekt osadzony. Oznacza to, że masz dokument Word z osadzonym w nim dokumentem Excel (faktycznie widzisz komórki Excela w programie Word). Po dwukrotnym kliknięciu osadzonego pliku Excel do pracy z nim program Excel jest uruchamiany, ale program Excel nie ładuje jego dodatków COM. Następnie, gdy uruchamiasz program Excel w jakikolwiek inny sposób, tak naprawdę właśnie używasz programu Excel, który był/jest już uruchomiony z osadzonego obiektu i nie będzie miał twoich dodatków COM.

To nie wydaje się być twoim problemem, ale pomyślałem, że możesz polubić trochę sympatii. ;)

Czy używasz projektanta dodatków w VB6? Nie miałem z tym problemu, ale próbujesz go złomować i zaimplementować IDTExtensibility2 bezpośrednio w klasie, a następnie zapisać własne wpisy rejestru, aby zarejestrować je jako dodatek COM. Lub rób to w drugą stronę, bo nie używasz projektanta.

Jedna rzecz, którą należy spróbować to zarejestrować dodatek jako rozszerzenie dla całego komputera, a nie tylko dodatek użytkownika. Z projektantem możesz zarejestrować się jako dodatek użytkownika. (Chociaż jest za to jakieś zadanie).

Czy jesteś w stanie to odtworzyć? Czy któraś z metod IDTExtensibility2 jest w ogóle wywoływana?

Przypuszczam, że możliwe są zakłócenia innych dodatków. Możesz pobrać moje narzędzie dodatku COM, aby sprawdzić, które dodatki są załadowane (okna dodatków COM w aplikacjach pakietu Office pokazują tylko dodatki użytkownika, a nie dodatki do komputera).

http://www.amosfivesix.com/download/stackoverflow/

Jeśli dodatek całkowicie przestanie się ładować, aplikacja Office mogła go wyłączyć. Idź do Pomoc | O | Wyłączone elementy i sprawdź, czy tam jest.

Excel ma kilka głupich opcji związanych z DDE (to, czego Explorer zwykle używa do otwierania dokumentów w innych aplikacjach). Narzędzia | Opcje | Ogólne | Ignoruj ​​inne aplikacje. Sprawdź, czy to ma znaczenie.

Jeśli nie możesz odtworzyć problemu, ale Twój klient może, możesz napisać dla nich specjalną wersję rejestrującą zdarzenia IDT ..., aby sprawdzić, czy tak się dzieje. Wyślij im makro, które sprawdza Excel.Application.Addins, aby zobaczyć, czy istnieje dodatek (wiem, że program Word ma ten model obiektu, nie wiem o Excelu, więc wybacz mi, jeśli nie).

Mam nadzieję, że to jakaś pomoc.

-Tom

+0

@Tom: Czy udało ci się dowiedzieć się problem, gdy Excel jest osadzony w innej aplikacji? Mam taki sam problem, gdy mój dodatek COM (który dodaje swój własny pasek poleceń do programu Excel) ładuje się, ale dodany pasek poleceń nie może być dostosowany (przyciski włączone/wyłączone) z wyjątkiem metody OnConnection(). – A9S6

+0

Niestety, nie. To nie było dla mnie ważne. Byłem w stanie powiedzieć ludziom "nie rób tego". ;) Lub zamknij obie aplikacje i uruchom je we właściwej kolejności. Nie jestem pewien, czy możesz coś zrobić. Wygląda jak błąd w aplikacjach Office. –

+0

dzięki za odpowiedź. Miałeś świetne pomysły i komentarze. – CtrlDot

3

Bardzo łatwy w 5 krokach

  1. Otwórz program Excel
  2. Przejdź do Plik> Opcje> Add-Ins
  3. idź do zarządzania: wybierz Wyłączone Produkty następnie kliknij Go
  4. W nowych oknach Znajdź swoje dodatki i kliknij Włącz
  5. Restart Excel
Powiązane problemy