late bound einer VB ActiveX DLL



  • Hallo Leute!

    ich möchte eine nicht registrierte ActiveX DLL (VB)
    in mein Programm einbinden(late bound).

    EXPORT (VB ActiveX DLL)
    DllCanUnloadNow
    DllGetClassObject
    DllRegisterServer
    DllUnregisterServer
    

    Ist das überhaupt möglich?

    In VB sieht mache ich es so:

    'Teil 1
    'registrieren der DLL
      hDLL = LoadLibrary("myDLL.dll")
      hProc = GetProcAddress(hDLL, "DllRegisterServer")
      hThread = CreateThread(ByVal 0, 0, ByVal hProc, ByVal 0, 0, hWSO)
      hWSO = WaitForSingleObject(hThread, 10000)
      CloseHandle hThread
      FreeLibrary hDLL
    
    'Teil 2
    'jetzt einen Verweis erstellen
      dim vbDLL as Object
      Set vbDLL = CreateObject("myDLL.clsDLL")
      vbDLL.test
      set vbDLL = nothing
    
    mein C Projekt sieht so aus:
    
    ...
    #include <windows.h>
    ...
    
    bool registerDll(const char *filename)
        {
        HINSTANCE hInst = LoadLibrary(filename);
        if (!hInst)
        {
        return false;
        }
        else
        {
        	HRESULT (FAR STDAPICALLTYPE * lpDllEntryPoint)(void); 
        (FARPROC&)lpDllEntryPoint = GetProcAddress(hInst, "DllRegisterServer");
        if (!lpDllEntryPoint)
        {
        return false;
        }
        else
        {
        	 HRESULT hr = (*lpDllEntryPoint)(); 
        if (hr)
        {
        return false;
        }
        }
        FreeLibrary(hInst);
        }
        return true;
        }
    
    int main(int argc, char* argv[])
    {
    	bool a;
    	a = registerDll("prjdll.dll");
    	if ( a == true) 
    	{
    		MessageBox(0, "DLL registriert", "", 0);
    	}else{
    		MessageBox(0, "DLL nicht registriert", "", 0);
    	}
    
    	// aber wie geht es weiter?????????
            // dim vbDLL as Object
            // Set vbDLL = CreateObject("myDLL.clsDLL")
            // vbDLL.test
            // set vbDLL = nothing
    
    	return 0;
    }
    

    Ist das was ich vorhabe möglich???

    P.S.: ich benutze M VC++ 6.0

    Danke für eure Hilfe

    mfg bump



  • - CoCreateInstance
    - QueryInterface auf IDispatch
    - Invoke



  • Hallo MFK!

    MFK schrieb:

    - CoCreateInstance
    - QueryInterface auf IDispatch
    - Invoke

    CoCreateInstance benötigt doch ne CLSID oder?

    aber

    hresult=CLSIDFromProgID(OLESTR("prjdll.clsdll"),&clsid);
    

    funktioniert nicht (es handelt sich hier um eine nicht registrierte ActiveX DLL.

    mfg bump



  • Hallo!

    @MFK: bitte vergiss meinen letzten post ⚠

    ich habe jetzt folgendes zusammengestrickt:

    ...
      CoInitialize(NULL);
    
      CLSID clsid;
      IUnknown *pUnknown;
      IDispatch* m_pDispApp;
      IDispatch* m_pFunc_SUB;
      DISPID dispID;
      DISPPARAMS dp = { NULL, NULL, 0, 0 };  
      IDispatch* pFunc_SUB = NULL;
      VARIANT varRetVal;
    
      HRESULT hr = CLSIDFromProgID(L"prjdll.clsdll", &clsid);
      hr = CoCreateInstance(clsid, NULL, CLSCTX_INPROC_SERVER, IID_IUnknown, (void **) &pUnknown);
      if (FAILED(hr)) {
        MessageBox(0, "CoCreateInstance failed","", 0);
      }
      hr = pUnknown->QueryInterface(IID_IDispatch,(void**)&m_pDispApp);
      if (FAILED(hr)) {
        MessageBox(0, "QueryInterface failed","", 0);
      }
    
      LPOLESTR szCall = L"subCallME"; //ohne Parameterübergabe
      hr = m_pDispApp->GetIDsOfNames(IID_NULL, &szCall, 1, LOCALE_SYSTEM_DEFAULT, &dispID);
      hr = m_pDispApp->Invoke(dispID, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD, &dp, &varRetVal, NULL, NULL);
    
      m_pFunc_SUB = varRetVal.pdispVal;
    
      m_pDispApp = NULL;
      m_pFunc_SUB = NULL;
      pUnknown->Release();
      CoUninitialize();
      ...
    

    ich rufe hier nur eine Procedure (subCallME) auf und es funktioniert 😃
    ABER wie kann ich der Procedure (siehe unten) einen Parameter übergeben?

    Public Sub subCallME(ByVal msg As String)
    

    Falls im C code Fehler sein sollten, bitte darauf hinweisen!

    Nochmals DANKE

    mfg bump



  • Zum Verständnis, nachdem du DllRegisterServer() aufgerufen hat ist deine
    DLL registriert und dein Client greift wie jeder Andere COM-Client darauf zu.
    Was soll also die Behauptung du würdest auf eine nicht registrierte DLL
    zugreifen.
    😕 😕 😕

    Wenn du mal die Beschreibung von Invoke() in der MSDN nachschlägst wirst du
    garantiert finden wie du die Parameter übergeben kannst. Ich wills jetzt nicht
    hierhin kopieren weil ich das für überflüssig halte.

    Warum holst du dir nicht gleich das IDispatch-Interface im CoCreateInstance()-
    Aufruf, dann kannst du dir das nachfolgende QueryInterface() schenken. Dann
    hättest du vielleicht auch nicht das Leak aufgrund des fehlenden Release() für
    das IDispatch-Interface, denn auch der QueryInterface macht ein AddRef(), sofern
    korrekt implementiert.
    😉

    m_pFunc_SUB = varRetVal.pdispVal;
    

    Was du hiermit beabsichtigst ist mir völlig schleierhaft.
    😕


Anmelden zum Antworten