Avatar billede bohbs Nybegynder
30. september 2003 - 19:46 Der er 10 kommentarer og
1 løsning

Lave en dll som jeg kan kalde fra C#

Jeg sidder og roder med at få adgang til MBM (motherboard monitor's shared memory, hvor de temperatur værdier den læser fra bundkortet er tilgængelige, se http://mbm.livewiredev.com/. Til det har jeg har fundet noget c++ kode, som jeg ønsker at få lavet om til en dll som kan importeres fra C#.

Men jeg kan ikke rigtig få det til at virke, har ikke arbejdet med c++ eller dll's før, så jeg er lidt på bar bund. Har fået lavet en dll der godt nok består af et par cpp filer og header selvom det kun er en enkelt jeg har brug for at få "wrappet". Den dll jeg har derfra mener mit c# program ikke den kan finde noget "EntryPoint" på, så nu sidder jeg lidt fast.

Nogen der vil lave dll'en for mig? Eller blot give mig opskriften? Dvs hvordan skal formatet af en dll fil være? Hvad består den egentlig af? Bare jeg kan få det til at virke så jeg er videre i projektet...

Nå det var en lang smøre så må vi se om der er nogen der gider/kan svare...
Avatar billede arne_v Ekspert
30. september 2003 - 19:47 #1
Hvilken C++ compiler bruger du ?
Avatar billede bohbs Nybegynder
30. september 2003 - 19:54 #2
mmm sidder i MS Visual Studio .Net
Avatar billede dilleberg Nybegynder
30. september 2003 - 20:56 #3
Start .NET
Vælg "File" | "New" | "Project..."

Project Types: Vælg "Visual C++ Projects"
Templates: Vælg "Win32 Project"
Tryk "OK"

I Win32 Application Wizard vælges "Application Settings"
Som Application Type vælges "DLL"
Fra Additional Options vælges "Export symbols"
Tryk "Finish"

Du kan nu bygge en DLL som indeholder
Entry point: DllMain
Exporterer en variabel, en funktion og en klasse.

Fyld selv mere på...

db
Avatar billede bohbs Nybegynder
30. september 2003 - 21:25 #4
mmm kigger lidt på det men det tager lidt tid... der findes ikke en funktion som så selv importer en cpp fil med header og gør det funktionsdygtigt?
Avatar billede bohbs Nybegynder
01. oktober 2003 - 13:53 #5
Okay jeg får bygget min dll, men jeg syntes ikke rigtigt jeg kan få hul igennem...

Dette er den cpp den som udga
Avatar billede bohbs Nybegynder
01. oktober 2003 - 18:19 #6
Okay, så er jeg tilbage, se bort fra ovenstående...

Hermed er den kode som jeg får genereret som udgangspunkt af MSV .NET:

// mindll.cpp : Defines the entry point for the DLL application.


#include "stdafx.h"
#include "mindll.h"

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 variable
MINDLL_API int nmindll=0;

// This is an example of an exported function.

MINDLL_API int fnmindll(void)
{
    return 42;
}

// This is the constructor of a class that has been exported.
// see mindll.h for the class definition
Cmindll::Cmindll()
{
    return;
}

----slut-----

Her er den kode jeg bruger fra c#

    public class Class1
    {

        [DllImport("mindll.dll", EntryPoint="fnmindll()")]
        public static extern int fnmindll();
       
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main(string[] args)
        {

            int test = fnmindll();
            Console.WriteLine("Blev der tilsluttet: ");
            Console.WriteLine(test);
           
           
        }
    }

----slut---

Men jeg får blot en exception om "EntryPoint fnmindll not found". Det samme sker hvis jeg ikke definerer et entrypoint i dllimportet. Hvordan skal min cpp kode være for at jeg kan kalde ind i den?
Avatar billede arne_v Ekspert
01. oktober 2003 - 18:31 #7
Prøv og put:

extern "C" {
...
}

omkring erklæringerne i .h filen !
Avatar billede bohbs Nybegynder
01. oktober 2003 - 20:36 #8
ok det kigger jeg på imorgen når jeg kommer til min spand igen. Kan du give en lille kort forklaring omkring "C", extern siger vel lidt sig selv?
Avatar billede arne_v Ekspert
01. oktober 2003 - 20:45 #9
extern "C" beder den om at bruge navnene som de er d.v.s. en funktion er
en funktion - i modsætning til C++ hvor en funktion både har et navn og nogle
argumenter, fordi C++ understøtter operator overloading.
Avatar billede bohbs Nybegynder
01. oktober 2003 - 21:31 #10
okay, det bliver spændende at se om jeg kan få hul så...
Avatar billede dilleberg Nybegynder
01. oktober 2003 - 23:04 #11
arne_v> Du har ret. Funktionen 'fnmindll' eksporteres under navnet
'?fnmindll@@YAHXZ' . Med 'extern...' bliver navnet 'fnmindll'

Som standard genereres en DLL som bl.a. eksporterer en klasse.
Derfor er klassen nød til at have dekorerede navne.

db
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester