16. september 2004 - 16:37Der 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?
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#
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?
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.
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.
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.
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...
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. //
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?
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++...
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 :)
Synes godt om
Ny brugerNybegynder
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.