Avatar billede up2nogood Nybegynder
16. september 2004 - 16:37 Der er 12 kommentarer og
1 løsning

DLL opbygning og brug i C5

Hejsa,
Jeg har opbygget en simpel DLL i C# .net og prøver nu at kalde den fra C5.

I min DLL har jeg en Test funktion der tager en int og en string ind. Den returnerer den string der bliver sendt.
DLL'en er testet i C# og virker som den skal.

Jeg har i C5 prøvet at kalde DLL'en i C5 via funktionerne DLLOPEN, DLLCALL, DLLCLOSE. DLLCALL bruger jeg således:
SET &dav = DLLCALL(&DLLHANDLE,"Test",3,"Hejsa")

Prøver jeg at printe &dav bagefter er den tom.

Skal en DLL fil opbygges specielt til C5 eller kalder jeg DLL'en forkert?
Avatar billede Broholm Novice
16. september 2004 - 18:18 #1
Den skal opbygges specielt til C5 og hvad jeg kan se, er C# desværre ikke tæt nok på "metallet" til at C5 kan bruge den. Det er dog muligt at lave den i Visual C++ .NET

DLL'en skal kopiere returværdien op i en global buffer og returnere pointeren til den til C5. Jeg ved ikke om man kan det i C#

-Broholm
Avatar billede up2nogood Nybegynder
16. september 2004 - 21:03 #2
Det du siger er altså at jeg sætter en pointer i C# til en variabel. Derefter sætter jeg via min funktion, returværdien i variablen. Min return indeholder derefter ikke selve variablen, men derimod pointerværdien?
Avatar billede Broholm Novice
16. september 2004 - 21:41 #3
Ja, det er sådan det skal laves i C++. Men jeg tror ikke at man kan gøre det "simpelt nok" i C# (CLR laver for meget bagved). Jeg snakkede med een som havde lavet det, men der brugte han en DLL skrevet i C++ som wrapper.
Avatar billede up2nogood Nybegynder
17. september 2004 - 11:33 #4
Efter hvad jeg kan læse, så laver CLR for meget omrokering i baggrunden, til at C# dll'en kan bruges direkte.

Kunne du eventuelt få at vide hvordan man skal kodeud fra en C++ wrapper?
Jeg kan se jeg kan downloade sourcekoden til en C++ wrapper forskellige steder fra. Dog har jeg meget lidt styr på kodning af DLL og C# i det hele taget. Så hvis du havde mulighed for et eksempel ville det være dejligt.
Avatar billede Broholm Novice
17. september 2004 - 16:34 #5
Ja, C5 og XAL er umiddelbart "for gammel" til at fatte hvad CLR gør...

En wrapper er bare noget som pakker noget andet ind. Den skal skrives specielt til C5. C5 kalder C++ DLL, som kalder C# DLL. Jeg har ikke sourcekoden til den tilgængelig - den var også kun i meget tidlig beta, men der var hul igennem.

Lav den enten i Visual C++ eller Delphi.
Avatar billede up2nogood Nybegynder
24. september 2004 - 08:46 #6
broholm, har du mulighed for at videregi noget eksempelkode eller lign?
Jeg vil meget gerne have det her op at køre, men synes ikke der er noget der vil spille endnu...
Avatar billede Broholm Novice
24. september 2004 - 23:51 #7
Her er en simpel MFC C++ fil som virker. Det er det bedste jeg kan gøre. Du bliver nødt til at anvende unmanaged code i din C# DLL.

// CAPITAL.cpp : Defines the initialization routines for the DLL.
//

#include "stdafx.h"
#include "CAPITAL.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

//
//    Note!
//
//        If this DLL is dynamically linked against the MFC
//        DLLs, any functions exported from this DLL which
//        call into MFC must have the AFX_MANAGE_STATE macro
//        added at the very beginning of the function.
//
//        For example:
//
//        extern "C" BOOL PASCAL EXPORT ExportedFunction()
//        {
//            AFX_MANAGE_STATE(AfxGetStaticModuleState());
//            // normal function body here
//        }
//
//        It is very important that this macro appear in each
//        function, prior to any calls into MFC.  This means that
//        it must appear as the first statement within the
//        function, even before any object variable declarations
//        as their constructors may generate calls into the MFC
//        DLL.
//
//        Please see MFC Technical Notes 33 and 58 for additional
//        details.
//

// CCAPITALApp

BEGIN_MESSAGE_MAP(CCAPITALApp, CWinApp)
END_MESSAGE_MAP()


// CCAPITALApp construction

CCAPITALApp::CCAPITALApp()
{
    // TODO: add construction code here,
    // Place all significant initialization in InitInstance
}


// The one and only CCAPITALApp object

CCAPITALApp theApp;
char* XALReturn = 0;


// CCAPITALApp initialization

BOOL CCAPITALApp::InitInstance()
{
    //Allocate globalbuffer for returnstring
    XALReturn = (char*)malloc(XALSTRMAX*sizeof(char));
    if( NULL == XALReturn )
        return FALSE;

    CWinApp::InitInstance();

    return TRUE;
}

int CCAPITALApp::ExitInstance()
{
    free(XALReturn);
    return CWinApp::ExitInstance();
}

extern "C" __declspec(dllexport) char* WINAPI STR2UPPER(long i,char* const arg)
{
    AFX_MANAGE_STATE(AfxGetStaticModuleState());
    CString ret = arg;
    return(strcpy(XALReturn,ret.MakeUpper().GetString()));
};

extern "C" __declspec(dllexport) char* WINAPI STR2LOWER(long i,char* const arg)
{
    AFX_MANAGE_STATE(AfxGetStaticModuleState());
    CString ret = arg;
    return(strcpy(XALReturn,ret.MakeLower().GetString()));
};
Avatar billede up2nogood Nybegynder
10. januar 2006 - 08:46 #8
Jeg er ikke meget for at gå i gang med C++, men på grund af det fine eksempel har Broholm fået pointene. :)
Avatar billede Broholm Novice
10. januar 2006 - 20:57 #9
Damn... Det er ellers lang tid siden. I mellemtiden har jeg fået lavet en DLL som kan bruges som wrapper til at kalde en .NET DLL, hvis det har interesse?
Avatar billede ali.k Nybegynder
28. februar 2006 - 22:09 #10
Jeg er interesseret, du må gerne sende til ali299 SnabelA msn punktum com
Avatar billede up2nogood Nybegynder
28. februar 2006 - 22:43 #11
Hov, havde ikke lige set din kommentar broholm.
Du må også meget gerne sende en mail til mig på:
mw SnabelA datasign punktum dk
Avatar billede up2nogood Nybegynder
01. august 2006 - 13:29 #12
broholm, er du der? Jeg har prøvet at smide en mail til dig på din gmail, men har ikke hørt fra dig.
Jeg synes ikke jeg kan få dit kode til at køre i VS 2005 Visual C++...
Avatar billede aidal Nybegynder
19. februar 2013 - 14:37 #13
Jeg er klar over at denne tråd er ret gammel efterhånden, men behovet for at kunne kommunikere med custom DLL'er fra C5 eksisterer stadig.

Jeg ved at der er kommet noget nyt i C5 2012, som man kan anvende til at kalde COM DLL'er, men her stopper mit kendskab til emnet også.

- Jeg ved ikke om man nu kan skrive sine DLL'er i C# eller om det stadig skal være unmanaged C++.

- Hvis man kan anvende C# nu, så ved jeg ikke hvad "best practice" fremgangsmåden er og ej heller hvordan DLL'en skal opbygges, for at kunne kaldes fra C5 (altså ud over at den skal være COM visible og registreres før brug).

Hvis der er nogen der kan svare på disse spørgsmål eller give et lille eksempel (gerne i form af et VS-projket, helst C#), så ville det være til stor hjælp.

Alternativt, noget dokumentation til denne nye del a C5 eller et link til noget info af en eller anden art.

Send evt. projekt til: aidatheonly at hotmail dot com

På forhånd tak :)
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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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