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 DllUnregisterServerIst 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 = nothingmein 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
- InvokeCoCreateInstance 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.
