Avatar billede htm Nybegynder
26. januar 2015 - 14:14 Der er 9 kommentarer og
1 løsning

Wrapper klasse til native c++ - unsigned char**

Hej,

Jeg har behov for at lave en wrapper klasse omkring en native c++ klasse som jeg kan bruge i mit C# projekt. Jeg har både dll, lib og header fil til klassen.

Jeg er dog lidt i vildrede hvordan definitinonen skal se ud og hvordan jeg skal implementere unsigned char **foo - håber I kan hjælpe.

Min header fil ser sådan ud (anonymiseret):

namespace foo{
namespace bar{

class foobar_EXPORT JohnDoe
{
    public:
        JohnDoe() {}
        ~JohnDoe() {}
   
        bool MakeTheImage(char *serialNumber, unsigned char **imageData, int &image_len);
 
};

Hvis I kunne komme med et eksempel på hvordan det skal implementeres i wrapper klassen og hvordan den wrapper klasse bruges i c# vil jeg være utrolig glad.
Det overordnede mål er at kunne bruge denne native klasse i C#.
Avatar billede arne_v Ekspert
26. januar 2015 - 15:17 #1
IntPtr??
Avatar billede htm Nybegynder
26. januar 2015 - 15:26 #2
Muligvis, men kommer til at bruge lidt mere hjælp? ImageData skal rumme et billede efter kaldet.

Jeg arbeder ikke ret meget i C++, så hvis du kunne hjælpe mig med definitionen i h-filen og implementationen i Cpp filen ville jeg være glad.
Avatar billede arne_v Ekspert
26. januar 2015 - 16:39 #3
C++ koden skulle bare vaere som ovenfor.

Det er paa C# siden man skal bruge IntPtr og de metoder som kan hente unmanaged data.
Avatar billede arne_v Ekspert
26. januar 2015 - 16:40 #4
Et alternativ til Win32 DLL og DllImport er at lave noget mixed mode C++.
Avatar billede htm Nybegynder
26. januar 2015 - 18:43 #5
Jeg mener nemlig uden DllImport. Med mindre man kan instantisere en klasse fra C++ i C# via DllImport?

Derfor laver jeg en wrapper klasse i Visual C++ som jeg kan inkludere direkte i mit C# projekt.

Men jeg ved netop ikke hvordan definitionen for den funktion skal være i header filen, og hvordan den skal implementeres i Cpp filen.

Den header i spørgsmålet er fra det library jeg ikke kan pille i.

Indtil videre har jeg en header fil der ser sådan ud:

public ref class JohnDoeClass
{
    public:
        JohnDoeClass() {}
        ~JohnDoeClass() {}

        bool MakeTheImage(String^ serialNumber, unsigned char **imageData, [Out] int image_len);
    private:
        foo::bar::JohnDoe *_client_instance;
};

og cpp filen:

JohnDoeClass::JohnDoeClass()
{
    _client_instance = new foo::bar::JohnDoe();
}

JohnDoeClass::~JohnDoeClass()
{
    if (_client_instance != nullptr) delete _client_instance;
}
bool JohnDoeClass::MakeTheImage(String^ serialNumber, unsigned char **imageData, [Out] int image_len);
{
    const char *serial = nullptr;
    unsigned char *image = nullptr;
    int imageLen;
    try
    {
        serial = (const char *)Marshal::StringToHGlobalAnsi(serialNumber).ToPointer();
        res = _client_instance->MakeTheImage(sn, imageData  , imageLen)
        image_len = imageLen;

    }
    finally
    {
        if (serial != nullptr) Marshal::FreeHGlobal(IntPtr((void*)serial));
    }

    return true;

}

Men jeg ved ikke om jeg bare kan bruge unsigned char **imageData og så en IntPtr i C# eller hvad jeg evt. skal lave det om til.
Jeg har ikke testet ovenstående, da jeg føler der mangler noget, eller jeg evt. ikke ryder rigtigt op?

Ved hellere ikke om jeg er helt på vildspor, har brug for et skub videre.
Avatar billede arne_v Ekspert
26. januar 2015 - 19:32 #6
Din C++/CLI kode skal ikke returnere char** men derimod en CLR data type.

Og der skal ikek inkluderes nogen header i C#. Du faar en DLL som du bruger i dit C# projekt ligesom du bruger C# libs.
Avatar billede htm Nybegynder
26. januar 2015 - 19:47 #7
Jeg aner jo netop ikke hvilken type jeg skal returnere i stedet for char**
Avatar billede arne_v Ekspert
26. januar 2015 - 19:54 #8
Hvad vil du helst have paa C# siden?

byte[] elelr byte[][] eller byte[,] ?
Avatar billede htm Nybegynder
26. januar 2015 - 19:55 #9
byte[]
Avatar billede htm Nybegynder
25. februar 2015 - 08:28 #10
Ikke rigtigt meget hjælpe eller løsning jeg fik. Lukker spørgsmålet
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

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