VBA und XLL unter 64 Bit



  • Hallo,
    ich migiriere gerade eine 32-Bit Applikation nach 64-Bit. Sowohl VBA als auch
    C++ Code komplilieren fehlerfrei.

    Allerdings stürzt mir Excel beim Aufruf einer Funktion der XLL immer ab.
    Ich vermute es hat mit dem Typ VARIANT zu tun, kann aber die Hinweise in Google
    nicht deuten.

    Ich bin so frei und hänge hier einen Auszug aus dem Code an.

    // C++ Deklaration
    WINOLEAUTAPI VariantClear(__inout VARIANTARG * pvarg);
    
    //C++ Funktion 
    
    __declspec(dllexport) DWORD WINAPI XLLRequest(DWORD src, DWORD dst, DWORD, DWORD) {
    
    	BSTR *request((BSTR*)src);
    	VARIANT *result((VARIANT*)dst);
    
    	::VariantClear(result);
    }
    
    // VBA Deklaration
    Public Declare PtrSafe Function GetProcAddress Lib "Kernel32.dll" (ByVal module As LongPtr, ByVal procName As String) As LongPtr
    Public Declare PtrSafe Function CallWindowProc Lib "user32.dll" Alias "CallWindowProcA" (ByVal func As LongPtr, ByVal par1 As LongPtr, ByVal par2 As LongPtr, ByVal par3 As LongPtr, ByVal par4 As LongPtr) As LongPtr
    
    // VBA
    Function check()
    Static Func_Address As LongPtr
    Dim My_DLL_Address As LongPtr
    
    My_DLL_Address = LoadLibrary(C:\temp" & "My.xll") 
    
    Func_Address = GetProcAddress(My_DLL_Address, "XXLRequest")
    
    ' Beide Aufrufvarianten bringen Excel zum Absturz.
    Get_XLLReqst = CallWindowProc(Func_Address, VarPtr("NAMES"), VarPtr(result), 0, 0)
    'oder
    Get_XLLReqst = CallWindowProc(Func_Address, 0, 0, 0, 0)
    
    End function
    

    Bin für jeden Tipp dankbar,
    Grüße
    lucio



  • Nicht alles ist ein LongPtr .

    LRESULT WINAPI CallWindowProc(
      _In_ WNDPROC lpPrevWndFunc,
      _In_ HWND    hWnd,
      _In_ UINT    Msg,
      _In_ WPARAM  wParam,
      _In_ LPARAM  lParam
    );
    

    Hier z.B. der UINT ist kein LongPtr sondern bloss ein Long .

    Im restlichen Code sieht auch einiges falsch aus

    My_DLL_Address = LoadLibrary(C:\temp" & "My.xll")   -- WTF?
    
    Get_XLLReqst = CallWindowProc(Func_Address, VarPtr("NAMES"), VarPtr(result), 0, 0)   -- Wo ist die Message-ID? Und nen Zeiger als Message-ID zu übergeben kann sowieso nicht hinhauen...
    

    => Vielleicht solltest du uns den Code zeigen den du wirklich verwendest, und nicht irgendwas was du für's Forum modifiziert hast?



  • Komisch, es gibt immer wieder Forenmitglieder, die es fertig bringen
    mit so einem Touch Überheblichkeit den Beitrag zu versauen.
    Antwortest Du, um Deine vermeintliche Überlegenheit zur Schau zu tragen?

    Ich habe noch keine 22584 Beiträge, verdiene aber seit bald 20
    Jahren mein Geld mit Entwicklung. Mein Anstand verbietet mir,
    den fachlichen Teil Deiner Antwort zu kommentieren.
    Du solltest aufmerksamer lesen, selbst wenn Du aus lauter
    Überdruß eine Antwort verfasst.

    Was soll 'WTF'? Hättest besser EM geschaut, statt hier zu posten.

    Mal sehen, ob es ein besseres Forum gibt.



  • husti hat dir doch aber ein paar wichtige Hinweise gegeben, die mir z.B. gar nicht aufgefallen waren.

    Prüfst du ob:
    My_DLL_Address = LoadLibrary(C:\temp" & "My.xll")
    und
    Func_Address = GetProcAddress(My_DLL_Address, "XXLRequest")
    überhaupt erfolgreich waren?
    Die zusammengesetzte Pfadangabe in LoadLibrary ist Mist, da "C:\tempMy.xll".
    Es müsste doch LoadLibrary("C:\temp\" & "My.xll") sein. Dein Ausschnitt wird garantiert vom Kompiler als Fehler erkannt (" fehlt vor C:\temp\"). Deshalb meint Husti, dass du den kompletten (richtigen) Code posten sollst.
    EDIT: ich merke gerade, dass das Forum das \\ hinter temp verschluckt, es muss doppelt sein, damit es hier erscheint. Deshalb die Irretationen.

    Also prüf doch mal ob My_DLL_Address und Func_Address gültig sind. Bin kein VB-Profi: eventuell Vergleich mit Nothing oder googlen.



  • Softwaremaker schrieb:

    EDIT: ich merke gerade, dass das Forum das \\ hinter temp verschluckt, es muss doppelt sein, damit es hier erscheint. Deshalb die Irretationen.

    Nö, in Code-Blöcken muss man da nix verdoppeln. Zumindest in den allermeisten Fällen nicht.
    Und ich hab den Beitrag von Grossmeister lucio77 auch zitiert, um zu gucken ob es bloss vom Forum verschluckt wurde (im Zitat sieht man den Original-Code). Wurde es nicht, Grossmeister lucio77 hat das selbst unterschlagen.



  • @lucio77
    Was kann ich dafür dass du Bullshit postest und dann nicht kritikfähig bist?

    lucio77 schrieb:

    Ich habe noch keine 22584 Beiträge, verdiene aber seit bald 20
    Jahren mein Geld mit Entwicklung.

    Wenn du dazu wirklich ein Kommentar haben willst sag es bitte.

    lucio77 schrieb:

    Mein Anstand verbietet mir,
    den fachlichen Teil Deiner Antwort zu kommentieren.

    lol

    lucio77 schrieb:

    Du solltest aufmerksamer lesen, selbst wenn Du aus lauter
    Überdruß eine Antwort verfasst.

    lol^2

    lucio77 schrieb:

    Was soll 'WTF'?

    Kannst du lesen? Kannst du VB?

    BTW: Deine DWORDs in Zeiger gecastet sind natürlich genau so Quatsch-mit-Sosse bei 64 Bit.
    Dafür gibt es den schönen Typen DWORD_PTR.
    Bzw. ist es auf der C++ Seite überhaupt gar nicht nötig hier Integer-Typen zu verwenden.
    Hier kannst du direkt Zeiger machen, und die Integer-Typen dann bloss auf der VBA Seite verwenden.


Log in to reply