DLL in VC++
-
Hi!
Meine C++ Kenntnisse sind leider etwas mager, dennoch versuche ich (verzweifelt) eine DLL in mein VC++ Programm einzubinden. Ich habe bereits schon einmal ein DLL eingebunden aber diesmal scheint es etwas schwieriger zu sein.
Ich habe versucht mit "dumpbin /exports name.dll" herauszufinden, welche Funktionen die DLL besitzt und wie ich diese ansprechen kann. Die Funktion schaun wie folgt aus:ordinal hint RVA name
1 0 000011D7 DllCanUnloadNow
2 1 00001209 DllGetClassObject
3 2 00001222 DllRegisterServer
4 3 00001231 DllUnregisterServerNun??
Ich habe keine Ahnung wie ich die DLL einbinden sollIch habe bereits die Hilfe schon durchforstet und bin darauf gestossen, dass dies ein COM-Interface ist! Tja - Bahnhof!
Kann mir jemand weiterhelfen?
Bitte - Danke!
-
-
schomal
LoadLibary und GetProcAdress angesehen
-
bei ner COM-DLL braucht man das aber nicht ! wie´s genau geht weiß ich aber auch nicht ^^
-
hab ich, ich weiß aber nicht, welche Funktion ich bei GetProcAdress angeben soll??
-
aus du auch noch andere dateien? zum beispiel header, type-lib etc. ?
-
Andere Datein (Header,etc.) hab ich nicht. Die DLL hab ich von den Behörden. Mit dieser DLL soll eine sicher Verbindung aufgebaut werden.
-
Hallo,
bei einer COM-DLL nützen Dir LoadLibrary und GetProcAddress nicht allzuviel.
Ich denke es müßt mit der Präprozessor-Anweisung #import gehen, als Beispiel
kann man sich das ansehen, wie man ADO in VC++ einbindet in der MSDM ansehen.
Wichtig ist bei Verwendung von COM-DLL's das Du die API ::CoInitialize(NULL)
und am ende des Programms ::CoUninitialze() aufrufst.
Ich hoffe das Hilft weiter, für genauere Anweisungen fehlt mir im Moment leider die Zeit.Gruß
-
schau mal hier: http://www.henkessoft.de/mfc_einsteigerbuch_kapitel15.htm
-
Mit der Seite
.. schrieb:
schau mal hier: http://www.henkessoft.de/mfc_einsteigerbuch_kapitel15.htm
konnte ich schon sehr viel Anfangen mit meiner DLL.
Aber: In der DLL kommt der Datentyp BSTR vor. Problem (muss nicht mit dem Typ zusammen hängen): Jedesmal, wenn ich die Funktion der DLL starte, stürzt das Programm ab mit dem Fehler: R6025 - pure virtual fuction callHat jemand eine Idee was das heißt?? Falscher Aufruf der Funktion?
-
MSDN:
C-Laufzeitfehler R6025
rein virtueller FunktionsaufrufEs wurde kein Objekt instantiiert, um den rein virtuellen Funktionsaufruf zu verarbeiten. Dieser Fehler wurde durch das Aufrufen einer virtuellen Funktion in einer abstrakten Basisklasse durch einen Zeiger verursacht, der durch eine Umwandlung in einen Typen der abgeleiteten Klasse erstellt wurde, jedoch tatsächlich ein Zeiger auf die Basisklasse ist. Dies kann auftreten, wenn ein void*, das während der Erstellung der Basisklasse erstellt wurde, auf einen Zeiger zu einer Klasse umgewandelt wird.
-
Hi!
Leider stürtzt mein simples Programm immer wieder ab, wenn ich auf die Funktion der COM-DLL zugreifen will - mit dem Fehler: "Der Vorgang read konnte nicht auf dem Speicher durchgeführt werden." Was für mich bedeutet, dass der Zeiger auf die DLL falsch sein müsste.
Anbei mein Programm:void main(int argc, char* argv[]) { HRESULT r,hr; CLSID clsid; IID IID_OADEDINET; long ret; BSTR des; BSTR pageinhalt; interface IOAdedinet : IDispatch { virtual long Adedinet( BSTR Nif, BSTR Edi, BSTR Descripcion, BSTR PaginaHtml) = 0; }; IOAdedinet* pwAdedinet; printf(" Anfang\n"); CoInitialize(NULL); if (( hr = CLSIDFromProgID(L"Adedinet.OAdedinet.1",&clsid)) != NOERROR ) { printf("Prog-ID nicht gefunden - Fehler = %x\n", hr); } if ((r =IIDFromString(L"{8DF74733-8667-4800-B107-1CD37F161EDE}",&IID_OADEDINET)) != NOERROR) { printf("Fehlber bei IIDFromString"); } r = CoCreateInstance(clsid, NULL, CLSCTX_INPROC_SERVER, IID_OADEDINET, (void**) &pwAdedinet); if(SUCCEEDED(r)) { ret = pwAdedinet->Adedinet((BSTR )"A59841783",(BSTR ) "TEST",des,pageinhalt); } pwAdedinet->Release(); CoUninitialize(); }
Das Interface in der DLL schaut wie folgt aus:
interface IOAdedinet : IDispatch { [id(0x00000001), helpstring("method Adedinet")] HRESULT Adedinet( BSTR Nif, BSTR Edi, [in, out, optional] BSTR Descripcion, [in, out, optional] BSTR PaginaHtml, [out, retval] long* retorno); [id(0x00000002), propget, helpstring("property descripcion")] HRESULT Descripcion([out, retval] BSTR* pVal); [id(0x00000002), propput, helpstring("property descripcion")] HRESULT Descripcion([in] BSTR pVal); [id(0x00000003), propget, helpstring("property paginahtml")] HRESULT PaginaHtml([out, retval] BSTR* pVal); [id(0x00000003), propput, helpstring("property paginahtml")] HRESULT PaginaHtml([in] BSTR pVal); };
thx for your help!
-
if(SUCCEEDED(r)) { ret = pwAdedinet->Adedinet((BSTR )"A59841783",(BSTR ) "TEST",des,pageinhalt); }
*kein Kommentar*
Siehe SysAllocString/SysFreeString in der MSDN
-
Leider hat sich nichts an der Fehlermeldung geändert: "Der Vorgang read konnte nicht auf dem Speicher durchgeführt werden."
SysFreeString(nif); nif = SysAllocString(L"A59841783"); SysFreeString(edi); edi = SysAllocString(L"Test"); SysFreeString(des); SysFreeString(pageinhalt); ret = pwAdedinet->Adedinet(nif,edi, des, pageinhalt);
-
Ist es zu heiss draussen oder was soll uns dieser Codeausschnitt sagen?