[VC++] dll maken met exported functies

Pagina: 1
Acties:

  • Dennis
  • Registratie: Februari 2001
  • Laatst online: 10:56
Ik probeer om een DLL te maken die een WebService aanroept. Deze DLL mag helaas niet in dotnet worden gemaakt, omdat hij onderdeel moet gaan uitmaken van een setup (msi) waarbij het nog allerminst zeker is dat het .net framework is geïnstalleerd.

Nou kan ik redelijk overweg met dotnet en c#, ook met de c++ syntax maar ik heb niet echt een idee hoe ik een functie kan declareren die ook extern benaderbaar is. De DLL moet tenslotte worden aangeroepen vanuit de setup.

Dit is de code die ik tot nu toe heb (alleen het bovenste deel).

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <cstdio>

#import "msxml3.dll"
using namespace MSXML2;

#import "C:\Program Files\Common Files\MSSoap\Binaries\MSSOAP1.dll" \
exclude("IStream", "ISequentialStream", "_LARGE_INTEGER", \
"_ULARGE_INTEGER", "tagSTATSTG", "_FILETIME")
using namespace MSSOAPLib;

int main(int argsc, char** argsv)
{
  CoInitialize(NULL);

  ISoapSerializerPtr Serializer;
  ISoapReaderPtr Reader;
  ISoapConnectorPtr Connector;


Uiteindelijk moet hij gebruik gaan maken van de MSSOAP toolkit die weliswaar niet meer wordt ondersteund, maar die toch prima zou moeten zijn voor dit doeleinde.

De functie heet nu dus main, maar de vraag is of hij nu wel goed zal gaan werken. Het is erg lastig om te testen, want ik heb bijvoorbeeld geen idee hoe ik exported functies ervan kan maken. Kan iemand mij vertellen wat ik precies moet aanpassen om dit geheel werkend te krijgen :?.

  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

in de msdn zal je wel dingen vinden bij:
extern "C" { }

en iets wat lijkt op decl_spec_export maar dit laatste weet'k niet pcies

ASSUME makes an ASS out of U and ME


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 05-05 18:07

.oisyn

Moderator Devschuur®

Demotivational Speaker

De extern "C" is om namemangling van C++ functies te voorkomen, de __declspec(dllexport) is om aan te geven dat hij het symbol in de dll exporteert. Je kunt ook een .def file toevoegen aan je project met al je functies erin die je wilt exporteren, extern "C" en __declspec is dan niet meer nodig.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Dennis
  • Registratie: Februari 2001
  • Laatst online: 10:56
Top jongens, dit waren precies de antwoorden die ik zocht. Dat van die .def files had ik gevonden maar ik vond het nogal nutteloos voor een simpele DLL met één functie. Nu met extern en declspec werkt het prima!
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <cstdio>
#include <string>

#import "msxml3.dll"
#import "C:\Program Files\Common Files\MSSoap\Binaries\MSSOAP1.dll" \
exclude("IStream", "ISequentialStream", "_LARGE_INTEGER", \
"_ULARGE_INTEGER", "tagSTATSTG", "_FILETIME")

using namespace std;
using namespace MSXML2;
using namespace MSSOAPLib;

extern "C"
{
    __declspec(dllexport) int testje(string licenseKey)
    {
        return 1;
    }
}

Om het te testen had ik een stukje c# (.NET) geschreven die deze DLL aanroept:
code:
1
2
3
4
5
6
7
        [DllImport("../../../Test/Debug/Test.dll")]
        private static extern int testje(string licenseKey);

        private void button1_Click(object sender, System.EventArgs e)
        {
            this.textBox1.Text = Convert.ToString(testje("ABCDE"));
        }

Dit werkt prima dus dat is nu iig klaar. Ik kan verder met de SOAP implementatie (SOAP toolkit 3) voor mijn C++ DLL :).

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 05-05 18:07

.oisyn

Moderator Devschuur®

Demotivational Speaker

overigens hoef je bij extern "C" niet per se de accolades te gebruiken; je mag het ook gewoon voor een declaratie zetten.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 04-05 13:09
Dennis schreef op maandag 06 juni 2005 @ 14:17:
Ik probeer om een DLL te maken die een WebService aanroept. Deze DLL mag helaas niet in dotnet worden gemaakt, omdat hij onderdeel moet gaan uitmaken van een setup (msi) waarbij het nog allerminst zeker is dat het .net framework is geïnstalleerd.

[...]
En een DLL in .NET maken gaat je sowieso niet lukken, omdat dit simpelweg niet ondersteund wordt :Y)
Past ook niet in het concept van een "Framework"

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack

Pagina: 1