Erweitern einer alten DLL



  • Hi

    Ich soll für meine Firma eine uralte Image processing DLL (jpeglib2 http://www.winsite.com/bin/Info?500000007253 ) um 2 Funktionen erweitern. Die Funktionen an sich habe ich schon ferig, allerdings stößt sich mein compiler an irgendwelchen, von mir nicht zu identifizierenden Fehlern. Da ich noch kaum Erfahrung mit c++ habe, kann mir eventl jemand von euch weiterhelfen. Vermutlich ist die Lösung offensichtlich.

    In die DLL habe ich folgende Funktionen integriert:
    header datei

    #ifdef HAVE_PROTOTYPES
    #define JPP(arglist)	arglist
    #else
    #define JPP(arglist)	()
    #endif
    
    EXTERN(void) jpeg_bufio_dest JPP((j_compress_ptr cinfo, BYTE * output_jpg));
    EXTERN(void) jpeg_bufio_src JPP((j_decompress_ptr cinfo, BYTE * input_jpg));
    

    cpp:

    struct jpeg_source_mgr {
      const JOCTET * next_input_byte; /* => next byte to read from buffer */
      size_t bytes_in_buffer;	/* # of bytes remaining in buffer */
    
      JMETHOD(void, init_source, (j_decompress_ptr cinfo));
      JMETHOD(boolean, fill_input_buffer, (j_decompress_ptr cinfo));
      JMETHOD(void, skip_input_data, (j_decompress_ptr cinfo, long num_bytes));
      JMETHOD(boolean, resync_to_restart, (j_decompress_ptr cinfo, int desired));
      JMETHOD(void, term_source, (j_decompress_ptr cinfo));
    };
    
    typedef struct {
    	struct jpeg_source_mgr manager;
    
    	BYTE* input_jpg;		/* input buffer */
    	JOCTET * buffer;		/* start of buffer */
    	boolean start_of_file;	/* have we gotten any data yet? */
    } buf_source_mgr;
    
    typedef buf_source_mgr * buf_src_ptr;
    
    GLOBAL (void)
    jpeg_bufio_dest (j_compress_ptr cinfo, BYTE * output_jpg)
    {
      buf_dest_ptr dest;
    
      if (cinfo->dest == NULL) {	/* first time for this JPEG object? */
        cinfo->dest = (struct jpeg_destination_mgr *)
          (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,
    				  SIZEOF(my_destination_mgr));
      }
    
      dest = (buf_dest_ptr) cinfo->dest;
      dest->manager.init_destination = init_destination;
      dest->manager.empty_output_buffer = empty_output_buffer;
      dest->manager.term_destination = term_destination;
      dest->output_jpg = output_jpg;
    }
    GLOBAL(void)
    jpeg_bufio_src (j_decompress_ptr cinfo, BYTE * input_jpg)
    {
      buf_src_ptr src;
    
      if (cinfo->src == NULL) {	/* first time for this JPEG object? */
        cinfo->src = (struct jpeg_source_mgr *)
          (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,
    				  SIZEOF(my_source_mgr));
        src = (my_src_ptr) cinfo->src;
        src->buffer = (JOCTET *)
          (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,
    				  INPUT_BUF_SIZE * SIZEOF(JOCTET));
      }
    
      src = (buf_src_ptr) cinfo->src;
      src->manager.init_source = init_source;
      src->manager.fill_input_buffer = fill_input_buffer;
      src->manager.skip_input_data = skip_input_data;
      src->manager.resync_to_restart = jpeg_resync_to_restart; /* use default method */
      src->manager.term_source = term_source;
      src->input_jpg = input_jpg;
      src->manager.bytes_in_buffer = 0; /* forces fill_input_buffer on first read */
      src->manager.next_input_byte = NULL; /* until buffer loaded */
    }
    

    Der Code sollte eigtl stimmen, da ich bereits bestehende Funktionen nur geringfügig verändert habe.
    Als Fehler bekomm ich ~400 mal folgendes:
    d:\src\jpeglib2\jpeglib.h(902) : error C2143: syntax error : missing ')' before ''
    d:\src\jpeglib2\jpeglib.h(902) : error C2081: 'BYTE' : name in formal parameter list illegal
    d:\src\jpeglib2\jpeglib.h(902) : error C2143: syntax error : missing '{' before '
    '
    d:\src\jpeglib2\jpeglib.h(902) : error C2059: syntax error : ')'
    d:\src\jpeglib2\jpeglib.h(903) : error C2143: syntax error : missing ')' before ''
    d:\src\jpeglib2\jpeglib.h(903) : error C2081: 'BYTE' : name in formal parameter list illegal
    d:\src\jpeglib2\jpeglib.h(903) : error C2143: syntax error : missing '{' before '
    '
    d:\src\jpeglib2\jpeglib.h(903) : error C2059: syntax error : ')'

    902/3 sind die Zeilen der Funktionsdefinition in der Header Datei.
    Da die DLL steinalt ist und ich schon öfter von Kompatibilitätsproblemen gelesen habe, vermute ich die Ursache dort. Leider hilft mir das auch nicht viel weiter, da ich nicht weiß wie die DLL portieren kann. Ohne meinen zugefügten src code lässt sie sich aber bei mir (VS 2005) fehlerfrei kompilieren.
    Ich bin für jede Hilfe dankbar! 🤡

    lg,

    Andreas



  • jpeg_bufio_dest JPP((j_compress_ptr cinfo, BYTE * output_jpg));
    

    Warum das (( und )) 🙂



  • Hi,

    Die Doppelklammer kommt durch die in der Header Datei stehende Define Anweisung (JPP)
    Wieso man diese define Anweisung benötigt, weiss ich nicht - sie war schon im Org. Src Code vorhanden.
    Trotzdem Danke für den Effort 🤡
    lG

    Andreas



  • schreib schön weit oben in dem header file

    #include <windows.h>
    

    rein, dann ist BYTE definiert, und alles wird gut 🙂 (ok, nicht garantiert, aber probier es mal)

    Alternativ könntest du dein "BYTE" auf "unsigned char" ändern.
    Und dir bei der Gelegenheit merken dass BYTE kein eingebauter Typ ist, sondern eine der vielen Windows Grausamkeiten.



  • Danke für Deine Mühe, das war wirklich Ursache des Fehlers!

    lg

    Andreas


Anmelden zum Antworten