anoniem Geplaatst: 8 december 2003 Delen Geplaatst: 8 december 2003 Ik ben al een week bezig een in C++ geschreven DLL te koppelen aan een VB6.0 applicatie. Dit lukt echter niet. Wanneer eindelijk na veel gepuzzel een dll is gemaakt met 0 errors en 0 warnings, meldt het VB programma steevast dat er geen entrypoint in de dll kan worden gevonden. Alle foutmeldingen komen ook op internet voor, omdat kennelijk meer mensen hier problemen mee hebben. 9 van de 10 oplossingen werken echter (bij mij) niet. Wat ik graag zou willen weten is, hoe schrijf ik een dll met één functie, die vanuit een VB-programma kan worden aangeroepen? Welke projectsettings moet ik gebruiken in Visual Studio 6? Wie zou mij (met een simpel voorbeeld bijv.) kunnen helpen? Alvast bedankt. Ynze. Quote Link naar reactie
anoniem Geplaatst: 8 december 2003 Auteur Delen Geplaatst: 8 december 2003 [url=http://msdn.microsoft.com/library/en-us/vccore98/HTML/_core_export_from_a_dll_using_..def_files.asp]Export from a DLL Using .DEF Files (Visual C++ Programmer's Guide ... [/url] 1. Je moet de functies declareren als stdcall (standard calling convention). 2. Je moet de functienamen exporteren. Quote Link naar reactie
anoniem Geplaatst: 9 december 2003 Auteur Delen Geplaatst: 9 december 2003 Bedankt nogmaals. Ik heb het geprobeerd, maar het resultaat is 0,0. Het lijkt erop dat met MS Visual Studio C++ geen correcte DLL's gemaakt kunnen worden. De linker genereert een entrypoint naar __DllMainCRTStartup@12, maar dit entrypoint wordt niet geëxporteerd. Mijn functie, die wel geëxporteerd wordt, staat in het rijtje gewone functies, en wordt niet genoemd als entry-point. Het VB-programma kan zowel __DllMainCRTStartup@12 als mijn functie niet vinden als entry-point. Als niemand een werkend voorbeeld heeft van een in C++ geschreven DLL die door een VB-applicatie kan worden aangeroepen, zit er denk ik niets anders op dan het hele programma in C++ te schrijven. Of heeft iemand nog een beter idee? Ynze. De werkelijkheid wordt niet begrensd door wat wij kunnen begrijpen, maar door wat wij kunnen ervaren. Quote Link naar reactie
anoniem Geplaatst: 10 december 2003 Auteur Delen Geplaatst: 10 december 2003 Je kunt ook DLL's in VB schrijven maar dan zit je wel met de beperkingen die een VB aan je opdringt. Gelukkig zijn dat er niet veel. :) Overigens weet ik niet of die VB dll's ook te gebruiken zijn door programma's die geschreven zijn in andere talen, ik heb daar nooit iets mee nodig gehad. Quote Link naar reactie
anoniem Geplaatst: 10 december 2003 Auteur Delen Geplaatst: 10 december 2003 Er was juist gekozen voor C++ boven VB om de beperkingen van VB te omzeilen. Ik ben inmiddels bezig het hele programma in C++ te schrijven, zodat er geen DLL meer nodig is. Toch blijf ik het raar vinden dat met alle geboden mogelijkheden in Visual Studio C++ (er zijn zelfs twee wizzards voor het maken van een DLL) het niet mogelijk blijkt een DLL te maken waarbij het entry-point een zelfgemaakte functie is, die vanuit bijvoorbeeld een VB-programma kan worden aangeroepen. Een DLL maken met behulp van VB werkt probleemloos, maar waarom een DLL gemaakt voor slects één toepassing, waar dat ook met een module kan? Ynze. Quote Link naar reactie
anoniem Geplaatst: 10 december 2003 Auteur Delen Geplaatst: 10 december 2003 [quote:991d603745="Y.L. Bicknese"]Bedankt nogmaals. Ik heb het geprobeerd, maar het resultaat is 0,0. Het lijkt erop dat met MS Visual Studio C++ geen correcte DLL's gemaakt kunnen worden. De linker genereert een entrypoint naar __DllMainCRTStartup@12, maar dit entrypoint wordt niet geëxporteerd. Mijn functie, die wel geëxporteerd wordt, staat in het rijtje gewone functies, en wordt niet genoemd als entry-point. Het VB-programma kan zowel __DllMainCRTStartup@12 als mijn functie niet vinden als entry-point. Als niemand een werkend voorbeeld heeft van een in C++ geschreven DLL die door een VB-applicatie kan worden aangeroepen, zit er denk ik niets anders op dan het hele programma in C++ te schrijven. Of heeft iemand nog een beter idee? [/quote:991d603745] Je moet expliciet de functieheaders definiëren als geëxporteerd. [b:991d603745]__declspec(dllexport)[/b:991d603745] int __stdcall fnSchaken(void); (zie eerdergenoemde link, ergens onderaan op die pagina staat een link.) __DllMainCRTStartup wordt intern aangeroepen zodra de DLL geladen wordt. Dat is dus eigenlijk je main functie in de source. Quote Link naar reactie
anoniem Geplaatst: 10 december 2003 Auteur Delen Geplaatst: 10 december 2003 Als je me nou kunt vertellen wat hier fout aan is......... // Schaken.cpp : Defines the entry point for the DLL application. // #include "stdafx.h" __declspec(dllexport) int __stdcall fnSchaken(void); BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE; } // This is an example of an exported function. __declspec(dllexport) int __stdcall fnSchaken(void) { return 42; } dan zou je mij heel erg blij maken. Ik had verwacht iets van 42 terug te krijgen in mijn VB-programma. Maar ik krijg alleen de mededeling: Can't find entry point fnSchaken in Chess.dll. Ynze. Quote Link naar reactie
anoniem Geplaatst: 10 december 2003 Auteur Delen Geplaatst: 10 december 2003 [code:1:7cefe4bc3a] // Schaken.cpp : Defines the entry point for the DLL application. // #include "stdafx.h" __declspec(dllexport) int __stdcall fnSchaken(void); BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE; } // This is an example of an exported function. int __stdcall fnSchaken(void) { return 42; } [/code:1:7cefe4bc3a] Maak een tekstbestand (.def ) aan met de volgende inhoud: [code:1:7cefe4bc3a] LIBRARY MIJNDLLBESTAND DESCRIPTION "DLL Omschrijving." EXPORTS fnSchaken @1 [/code:1:7cefe4bc3a] Voeg nu dit bestand toe aan je project. En compileren... Quote Link naar reactie
anoniem Geplaatst: 15 december 2003 Auteur Delen Geplaatst: 15 december 2003 Heb dezelfde fout in VB, m'n DLL is geschreven met VB, hoe zit dit dan in VB? Quote Link naar reactie
anoniem Geplaatst: 10 januari 2004 Auteur Delen Geplaatst: 10 januari 2004 Ik kan niet met een C++ compiler om gaan. Van VB heb ik ook geen kaas gegeten. Misschien heb je hier wat aan. http://libertybelle.0catch.com/dll.htm Succes. Quote Link naar reactie
anoniem Geplaatst: 11 januari 2004 Auteur Delen Geplaatst: 11 januari 2004 [quote:34b352ef12="Rynus Rein"]Heb dezelfde fout in VB, m'n DLL is geschreven met VB, hoe zit dit dan in VB?[/quote:34b352ef12] Wat is de code (van de DLL en de DLL-functie definitie)? Quote Link naar reactie
anoniem Geplaatst: 11 januari 2004 Auteur Delen Geplaatst: 11 januari 2004 Ik post niet heel m'n DLL voor het gemak, omdat de functie's qua structuur toch niet verschillen, dit zijn 2 functie's: [code:1:30f5e5af62] Public Function Kwd(Grondgetal As Variant) Kwd = Grondgetal * Grondgetal End Function Public Function Mcht(Grondgetal As Variant, Exponent As Variant) Dim getal As Variant Dim i getal = Grondgetal For i = 2 To Exponent getal = getal * Grondgetal Next i Mcht = getal End Function[/code:1:30f5e5af62] En die compileer ik dan, zet ik in m'n system32 folder. Die voeg ik dan via References toe, maar dan kan ik ze helaas nog niet gebruiken, terwijl dit met andere DLL's blijkbaar wel gaat. Quote Link naar reactie
anoniem Geplaatst: 11 januari 2004 Auteur Delen Geplaatst: 11 januari 2004 [quote:414b4ab426="Rynus Rein"]Ik post niet heel m'n DLL voor het gemak, omdat de functie's qua structuur toch niet verschillen, dit zijn 2 functie's: ... En die compileer ik dan, zet ik in m'n system32 folder. Die voeg ik dan via References toe, maar dan kan ik ze helaas nog niet gebruiken, terwijl dit met andere DLL's blijkbaar wel gaat.[/quote:414b4ab426] Dit is een ander soort DLL, dan van de topic starter. Het maken en gebruiken van een ActiveX DLL heeft meer "voeten in de aarde" dan het maken van een "classic DLL" [url=http://msdn.microsoft.com/library/en-us/vbcon98/html/vbconcreatinganinprocesscomponent.asp]Creating an ActiveX DLL (Visual Basic 6.0 Documentation)[/url] Quote Link naar reactie
Aanbevolen berichten
Om een reactie te plaatsen, moet je eerst inloggen