[C++\VB.Net] DLL aanroepen EntryPointNotFoundException

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Aushyro
  • Registratie: Mei 2009
  • Laatst online: 07-09-2023
Hallo,

Ik ben even bezig met programmeren en ik vraag me eigenlijk iets af.

Ik zal eerst beginnen met wat soruce:

TestDLL.h:
code:
1
2
3
4
5
6
#include <iostream>
#include <stdio.h>
#include <conio.h>
#include <windows.h>

#include <winioctl.h>


TestDLL.ccp:
code:
1
2
3
4
5
6
7
#include "TestDLL.h"

int __stdcall TestFunc(int SelBut, int ButVal)
{
\\ Wa code enzo...
return 4;
};


TestDLL.def:
code:
1
2
3
4
5
LIBRARY TestDLL

EXPORTS

    TestFunc @1


En vanuit VB roep ik deze zo aan:
code:
1
2
3
4
5
6
    <DllImport("TestDLL")> Public Shared Function TestFunc(ByVal SelBut As Integer, ByVal ButVal As Integer) As Integer
    End Function

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        MsgBox(TestFunc(1, 1))
    End Sub


Ik programmeer in Visual studio 2008

en als ik in VB op Button1_Click click dan krijg ik volgende melding:
EntryPointNotFoundException: Kan ingangspunt met de naam TestFunc niet vinden in DLL TestDLL.

Wat doe ik fout?

Acties:
  • 0 Henk 'm!

  • MrBucket
  • Registratie: Juli 2003
  • Laatst online: 29-10-2022
Ik kan wel een gok doen: de naam van de C++ functie die je denkt te exporteren is niet de naam zoals die uiteindelijk in de dll terecht komt: C++ gebruikt namelijk "name mangling" om functieoverloads mogelijk te maken.

Je kunt bijv. de DLL export viewer gebruiken om dit te controleren.

Om name mangling te voorkomen moest je geloof ik je functiedeclaratie in een extern "C" block opnemen, zodat de compiler vindt dat het C code is, en dus niet gemangled hoeft te worden:
C++:
1
2
3
extern "C" {
void foo(void);
}

Acties:
  • 0 Henk 'm!

  • Sebazzz
  • Registratie: September 2006
  • Laatst online: 19:58

Sebazzz

3dp

Je kan trouwens ook met de Dependency Walker die standaard met de .NET of Windows SDK meekomt de exports bekijken ;)

[Te koop: 3D printers] [Website] Agile tools: [Return: retrospectives] [Pokertime: planning poker]


Acties:
  • 0 Henk 'm!

  • Aushyro
  • Registratie: Mei 2009
  • Laatst online: 07-09-2023
Ik krijg met de export viewer en de Dependency Walker geen exports te zien. ook niet als ik
code:
1
2
3
extern "C" { 
void TestFunc(void); 
}

toevoeg aan de header file (als ik het goed heb)

Acties:
  • 0 Henk 'm!

  • MrBucket
  • Registratie: Juli 2003
  • Laatst online: 29-10-2022
Hmm, het lijkt alsof er dan helemaal geen functies geexporteerd worden.

Probeer eens _declspec (dllexport) voor je functiedeclaratie te zetten?
C++:
1
_declspec (dllexport) void foo();


Het is te lang geleden dat ik met C(++) en/of dll entry points heb gewerkt...

Acties:
  • 0 Henk 'm!

  • Aushyro
  • Registratie: Mei 2009
  • Laatst online: 07-09-2023
Nee, werkt ook niet, compiled success, maar krijg nog steeds EntryPointNotFoundException in VB

[ Voor 77% gewijzigd door Aushyro op 31-05-2009 19:41 ]


Acties:
  • 0 Henk 'm!

  • MrBucket
  • Registratie: Juli 2003
  • Laatst online: 29-10-2022
danny.daemen schreef op zondag 31 mei 2009 @ 19:38:
Nee, werkt ook niet, compiled success, maar krijg nog steeds EntryPointNotFoundException in VB
Dan kan ik de vinger er niet op leggen wat er verkeerd gaat. Misschien dat je hier nog wat bruikbare info vindt?

http://msdn.microsoft.com/en-us/library/z4zxe9k8(VS.80).aspx

Acties:
  • 0 Henk 'm!

  • Aushyro
  • Registratie: Mei 2009
  • Laatst online: 07-09-2023
AHA! Problem solved :D, in compileerde de C++ source in een VS 6.0 omgeving, en nu werkt het wel :D

Acties:
  • 0 Henk 'm!

  • MrBucket
  • Registratie: Juli 2003
  • Laatst online: 29-10-2022
danny.daemen schreef op zondag 31 mei 2009 @ 20:30:
AHA! Problem solved :D, in compileerde de C++ source in een VS 6.0 omgeving, en nu werkt het wel :D
Nou ja, "problem solved"... hij doet het onder VS6.0, maar nog steeds niet onder VS2K8 ;)

Ik vermoed dat in VS2K8 je ergens nog een paar vinkjes moet zetten / weghalen op de properties van je Project. Je maakt mij niet wijs dat je in VS2K8 niet gewoon een simpele DLL met wat exports kan bouwen...

Acties:
  • 0 Henk 'm!

Verwijderd

sowieso kan je volgens mij name mangling voorkomen door op nummer een dllimport te doen. als ik het me goed herinner kan je gewoon de attribute entrypoint meegeven (met bijbehorend nummer) in de dllimport instructie.

een dllexport in c++ is overigens niet nodig, als je een .def bestand hebt. begin alleen nu een beetje te twijfelen...

voor de rest is het handig als je weet of de functie goed geexporteerd worden, als dat niet het geval is zal je VB app ook nooit goed gaan werken.

Acties:
  • 0 Henk 'm!

  • Sebazzz
  • Registratie: September 2006
  • Laatst online: 19:58

Sebazzz

3dp

Verwijderd schreef op maandag 01 juni 2009 @ 01:38:
een dllexport in c++ is overigens niet nodig, als je een .def bestand hebt. begin alleen nu een beetje te twijfelen...
Nee, zo ver ik weer is een def bestand alleen voor de compiler als controle, alles wat in het def(exports definition file) bestand staat moet ge-exporteerd zijn. Ik moest bijvoorbeeld een keer de 64-bit versie van de SQLite DLL compileren, en zonder def bestand exporteerde deze DLL niets, en met def bestand wel maar gaf hij wel fouten op functions die in het def bestand staan maar niet ge-exporteerd werden in de code.

Meer leesvoer:
Exporting from a DLL Using DEF Files
Module-Definition (.def) Files

[Te koop: 3D printers] [Website] Agile tools: [Return: retrospectives] [Pokertime: planning poker]


Acties:
  • 0 Henk 'm!

  • MrBucket
  • Registratie: Juli 2003
  • Laatst online: 29-10-2022
Sebazzz schreef op maandag 01 juni 2009 @ 09:51:
[...]

Nee, zo ver ik weer is een def bestand alleen voor de compiler als controle, alles wat in het def(exports definition file) bestand staat moet ge-exporteerd zijn. Ik moest bijvoorbeeld een keer de 64-bit versie van de SQLite DLL compileren, en zonder def bestand exporteerde deze DLL niets, en met def bestand wel maar gaf hij wel fouten op functions die in het def bestand staan maar niet ge-exporteerd werden in de code.
Hmm, volgens mij zijn __declspec(dllexport) en .def files alternatieve manieren om hetzelfde te bereiken: beide zorgen ervoor dat functies in de exporttabel van de dll terecht komen:
In newer compiler versions, you can export data, functions, classes, or class member functions from a DLL using the __declspec(dllexport) keyword. __declspec(dllexport) adds the export directive to the object file so you do not need to use a .def file.
(...)
Many export directives, such as ordinals, NONAME, and PRIVATE, can be made only in a .def file, and there is no way to specify these attributes without a .def file. However, using __declspec(dllexport) in addition to using a .def file does not cause build errors.
Waar ik net ook nog tegenaan liep, en waar ik niet aan had gedacht: standaard wordt in C/C++ de __stdcall calling conventie gebruikt, tenzij het om een functie met een variabel aantal argumenten gaat, of wanneer de functie met een andere calling convention is gedecoreerd. En voor __stdcall wordt (als je __declspec(dllexport) gebruikt) ook een name mangling scheme gehanteerd (int multiply(int a, int b) wordt als _multiply@8 geexporteerd).

Dit kun je tegengaan door ofwel de __cdecl calling convention te gebruiken (deze heeft geen name mangling), of door in plaats van __declspec(dllexport) een .def file te gebruiken waarin je expliciet de te exporteren naam van de functie opgeeft.

Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 17:02
Sebazzz schreef op maandag 01 juni 2009 @ 09:51:
Nee, zo ver ik weer is een def bestand alleen voor de compiler als controle, alles wat in het def(exports definition file) bestand staat moet ge-exporteerd zijn.
Untrue, de functies in je .def worden geexporteerd. ( onafhankelijk van dllexport dus )

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.

Pagina: 1