Vraag & Antwoord

Programmeren

C++ DLL aanmaken voor VB6.0 geeft altijd: No entry point etc

12 antwoorden
  • 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.
  • [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.
  • 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.
  • 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.
  • 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: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.
  • 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.
  • [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...
  • Heb dezelfde fout in VB, m'n DLL is geschreven met VB, hoe zit dit dan in VB?
  • 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: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)?
  • 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.

Beantwoord deze vraag

Weet jij het antwoord op deze vraag? Registreer of meld je aan met je account

Dit is een gearchiveerde pagina. Antwoorden is niet meer mogelijk.