Avatar billede MasterException Nybegynder
23. juni 2009 - 12:47 Der er 10 kommentarer og
1 løsning

Redirect stdout fra unmanaged DLL til textbox i en form???

jeg sidder med et problem jeg har en dll der er skrevet i c/c++. Her skriver jeg en masse status ud med printf, hvordan får jeg det Redirect op til min managed code på en simpel måde, og helst ved uden at ændre i dll´en.

jeg har fået Redirect Console.WriteLine, så den kan skrive i en textbox på en form, jeg troede så at alt stdout så ville komme den vej men ak nej.
Avatar billede arne_v Ekspert
23. juni 2009 - 15:04 #1
Hvis den DLL er static linked, saa mener jeg ikke at du kan goere det.

Men er den dynamic linked (og det er den nu nok), saa kan du:
- lave en ny DLL som redirecter stdout til en pipe og kalder den foerste DLL
- kalde den DLL fra dit C# program og bagefter hente data fra den anden DLL som bare laeser fra pipe'n
Avatar billede arne_v Ekspert
04. august 2009 - 03:27 #2
?
Avatar billede MasterException Nybegynder
04. august 2009 - 22:13 #3
undskyld jeg ikke lige har fået svaret den var lige gået i glemme bogen. har heller ikke lige fået arbejdet videre med mit problem, da der har været andet der lige skulle laves først.

men min dll er static linken så det tegner jo ikke så godt jf. din beskrivelse.

men kan det ikke lade sig gøre at lave en callback til min c# applikation så hver gang operationen printf bliver brugt i min c dll så ved hjælp af nået mackro trylleri bliver sprintf benyttet til at ligge teksten i et char array også bliver der kaldt en operation der eksekver callbacket med dette array som agument...

pritf(...)  -mackro->  sprintf(buffer,...)  -mackro->  printtextinC(...)  -callback->  printtextinc#(...)
Avatar billede arne_v Ekspert
06. august 2009 - 03:40 #4
Har du adgang til C kildekoden ?

Fordi så kan det godt lade sig gøre uanset static eller dynamic link.

Det er kun hvis man har en DLL uden kildekode at static link er et problem.

En mulighed var ganske rigtigt at bruge nogle makroer.
Avatar billede arne_v Ekspert
06. august 2009 - 04:08 #5
Eksempel følger.
Avatar billede arne_v Ekspert
06. august 2009 - 04:08 #6
#include <stdio.h>
#include <stdarg.h>

typedef void (__stdcall *callback)(char *);

static callback cb;

/* start hacks */
#define printf my_printf

int my_printf(char *fmt,...)
{
    int n;
    char buf[1000];
    va_list argptr;
    va_start(argptr, fmt);
    n = vsprintf(buf, fmt, argptr);
    va_end(argptr);
    cb(buf);
    return n;
}
/* end hacks */

#ifdef __cplusplus
extern "C"
{
    __declspec(dllexport) void __stdcall set_callback(callback newcb);
    __declspec(dllexport) void __stdcall dosomething();
}
#endif

__declspec(dllexport) void __stdcall set_callback(callback newcb)
{
    cb = newcb;
}

__declspec(dllexport) void __stdcall dosomething()
{
    printf("bla bla\n");
    printf("%d\n", 123);
    printf("%s\n", "ABC");
}
Avatar billede arne_v Ekspert
06. august 2009 - 04:09 #7
using System;
using System.Runtime.InteropServices;

public delegate void CallBack(string s);

public class Test
{
    [DllImport("cb.dll", EntryPoint="set_callback")]
    public static extern void SetCallBack(CallBack cb);
    [DllImport("cb.dll", EntryPoint="dosomething")]
    public static extern void DoSomething();
    public static void Main()
    {
        SetCallBack(TestCallBack);
        DoSomething();
    }
    public static void TestCallBack(string s)
    {
        Console.Write(s);
    }
}
Avatar billede MasterException Nybegynder
06. august 2009 - 14:31 #8
Fornemt sådan at lave et eksempel det var noget i den stil jeg også havde tænkt men jeg takker.

Jeg vil prøve at implementer din løsning. Så du kan bare smide et svar.
Avatar billede arne_v Ekspert
06. august 2009 - 14:41 #9
svar
Avatar billede MasterException Nybegynder
07. august 2009 - 10:15 #10
arne_v jeg ved ikke om du kan hjælpe mig en sidste gang...

for når jeg har implementeret din kode i mit system får jeg en Exception smidt i hoved CallbackOnCollectedDelegate med denne beskrivelse

Der blev foretaget et tilbagekald af en spildopsamlet stedfortræder af typen 'ASIM_PCIwrapper!ASIM_PCIwrapper.ASIMController+PrintCallBack::Invoke'. Det kan medføre programnedbrud, beskadigelser og tab af data. Når stedfortrædere sendes til ikke-administreret kode, skal de holdes levende af det administrerede program, indtil det garanteres, at de aldrig kaldes igen.

ved du hvordan jeg holder den ikke-administreret kode i live fra den administrerede del...
Avatar billede MasterException Nybegynder
07. august 2009 - 12:13 #11
har løst problemet det tænk ikke på det.
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