Avatar billede testpilot_dk Nybegynder
15. april 2005 - 11:11 Der er 26 kommentarer og
1 løsning

Opbygning af DLL fil

Nu har jeg endelig fået loade min dll ind i C# sharp, men har nogle problemer med at kalde funktioner i selve dll filen,

ER der nogen bestemt måde at opbygge c++ dll filer på, hvis ja hvad skal jeg gøre for at jeg kan kalde mine metoder i filen.

har forsøgt med    
__declspec(dllexport)CString Decrypt(CString strText, CString strKey); i header, skal jeg gøre andet
Avatar billede arne_v Ekspert
15. april 2005 - 11:15 #1
Jeg tror du får problemer med CString - det er en MFC ting !
Avatar billede testpilot_dk Nybegynder
15. april 2005 - 11:21 #2
hvordan kan jeg så returnere en streng
Avatar billede testpilot_dk Nybegynder
15. april 2005 - 11:34 #3
kan man ikke opbygge en mfc dll
Avatar billede arne_v Ekspert
15. april 2005 - 11:47 #4
Det er ikke noget problem at lave en DLL som bruger MFC.

Problemet er mapningen mellem C# typer og native C++ typer.
Avatar billede arne_v Ekspert
15. april 2005 - 11:49 #5
Jeg mener at C# string og native C++ char* matcher - jeg er meget skeptisk
over hvad en CString skulle være i .NET
Avatar billede testpilot_dk Nybegynder
15. april 2005 - 11:59 #6
ja, det kan jeg selvfølgelig godt se, men jeg kan vel sagtens benytte CString i selve dll filen og så bruge char * til det funktioner som skal snakke med C#
Avatar billede arne_v Ekspert
15. april 2005 - 12:03 #7
ja
Avatar billede testpilot_dk Nybegynder
15. april 2005 - 12:13 #8
Hvordan laver jeg så min CString om til en char *! jeg har forsøgt med at cast den
altså

return (char *)str;
Avatar billede arne_v Ekspert
15. april 2005 - 12:44 #9
char *ditchararray = (LPCTSTR)dincstring;

hvis du kun skal bruge værdien (altså ikke ændre den)
Avatar billede arne_v Ekspert
15. april 2005 - 12:44 #10
hov det skal nok være

const char *ditchararray = (LPCTSTR)dincstring;
Avatar billede testpilot_dk Nybegynder
15. april 2005 - 13:20 #11
ja, okay, nu har jeg fået den til at kompilere uden fejl, men er det rigtigt nok med
__declspec(dllexport)const char * Decrypt(CString strText, CString strKey);

eller skal jeg gøre noget andet ??
Avatar billede arne_v Ekspert
15. april 2005 - 13:39 #12
skal de 2 argumenter ikke også være const char * ?
Avatar billede arne_v Ekspert
15. april 2005 - 13:40 #13
Jeg her iøvrigt et eksempel.
Avatar billede arne_v Ekspert
15. april 2005 - 13:40 #14
#ifdef STRDLL_EXPORTS
#define STRDLL_API __declspec(dllexport)
#else
#define STRDLL_API __declspec(dllimport)
#endif

extern "C"
{
STRDLL_API char *dup(char *s);
}
Avatar billede arne_v Ekspert
15. april 2005 - 13:40 #15
#include "stdafx.h"
#include "StrDLL.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;
}

static char buf[100];

STRDLL_API char *dup(char *s)
{
    strcpy(buf,s);
    strcat(buf,s);
    return buf;
}
Avatar billede arne_v Ekspert
15. april 2005 - 13:41 #16
using System;
using System.Runtime.InteropServices;

class MainClass
{
    [DllImport("D:\\IDEProjects\\VisualStudio\\StrDLL\\Release\\StrDLL.dll")]
    private static extern string dup(string s);
    public static void Main(string[] args)
    {
        string s1 = "abc";
        string s2 = dup(s1);
        Console.WriteLine(s1 + "->" + s2);
    }
}
Avatar billede testpilot_dk Nybegynder
15. april 2005 - 14:01 #17
er dette her din header fil : 15/04-2005 13:40:42
hvis ja, så har du ikke nogen klasse til den.

Skal man have en main i sin dll fil
Avatar billede arne_v Ekspert
15. april 2005 - 14:13 #18
min kode er C ikke C++

det er vist god skik og brug at have en DllMain i sin DLL
Avatar billede testpilot_dk Nybegynder
15. april 2005 - 14:24 #19
Okay

Det skal laves for alle funktioner som skal ud/ind af dll filen
#ifdef STRDLL_EXPORTS
#define STRDLL_API __declspec(dllexport)
#else
#define STRDLL_API __declspec(dllimport)
#endif
Avatar billede testpilot_dk Nybegynder
15. april 2005 - 14:27 #20
Når man laver et win32 projekt, starter den op på følgende måde

header:
#ifdef DES_EXPORTS
#define DES_API __declspec(dllexport)
#else
#define DES_API __declspec(dllimport)
#endif

// This class is exported from the DES.dll
class DES_API CDES {
public:
    CDES(void);
    // TODO: add your methods here.
};

extern DES_API int nDES;

DES_API int fnDES(void);

CPP

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// The one and only application object

CWinApp theApp;

using namespace std;

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
    int nRetCode = 0;

    // initialize MFC and print and error on failure
    if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
    {
        // TODO: change error code to suit your needs
        _tprintf(_T("Fatal Error: MFC initialization failed\n"));
        nRetCode = 1;
    }
    else
    {
        // TODO: code your application's behavior here.
    }

    return nRetCode;
}
Avatar billede testpilot_dk Nybegynder
15. april 2005 - 14:41 #21
nu har jeg lavet et simpelt projekt, kun med en funktion i, jeg kan stadig ikke bruge det.

Hvad gør jeg galt

Mit kode ligger på www.testpilot.dk/dllfiler/dll.rar

De eneste forskelle er vores main er forskellige og jeg i c++ og dit i c
Avatar billede driis Nybegynder
15. april 2005 - 16:57 #22
Jeg mener du skal have en .def fil hvor du lister de funktioner i DLL'en der skal kunne kaldes af andre programmer. Har du det ?
Avatar billede testpilot_dk Nybegynder
15. april 2005 - 19:52 #23
Der er ikke noget i min .def fil, hvordan får jeg noget i den, eller skal jeg selv lave den.

hvis jeg selv skal lave den, hvordan gør jeg så ???
Avatar billede arne_v Ekspert
15. april 2005 - 22:59 #24
VC++ plejer at kunne eksportere __declspec(dllexport) navnene uden .def fil
Avatar billede driis Nybegynder
15. april 2005 - 23:22 #25
Du skal blot skrive flg. i din .def fil:

EXPORTS
myFunction1
myFunction2

osv.

arne >> Du har sikkert ret i at VC++ kan eksportere uden en .def fil - jeg husker blot at det var løsningen på et lignende problem jeg havde engang.
Avatar billede testpilot_dk Nybegynder
18. april 2005 - 10:28 #26
jeg har ikke kunne få den til det og jeg har ikke mere tid til at forsøge mig med det, så arne_v send et svar
Avatar billede arne_v Ekspert
18. april 2005 - 10:32 #27
ok
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