Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   C: Callback Funktion aus DLL verlagern (https://www.delphipraxis.net/144942-c-callback-funktion-aus-dll-verlagern.html)

R2009 20. Dez 2009 09:22


C: Callback Funktion aus DLL verlagern
 
Hi,
nächstes Problem:
Ich habe eine Funktion deschrieben, die Parameter an Sqlite weitergibt.
Unter anderem auch eine Callbackfunktion. Jetzt möchte ich die Callbackroutine aus der DLL raus haben.
Die Callbackroutine soll im Delphi Programm stehen.
das problem ist, dass ich die Callbackadresse irgendie weitergeben muss!
Wie kann ich das machen?

Code:
static int callback(void *NotUsed, int argc, char **argv, char **azColName){
  int i;
  for(i=0; i<argc; i++){
   // printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
  }
  printf("\n");
  return 0;
}

extern "C" __declspec( dllexport ) void QtTestDll_Sqlite(char* Database,char* SQL_string)
{
    sqlite3 *db;
    char *zErrMsg = 0;
    int rc;
    TCHAR Inhalt[101];

    rc = sqlite3_open(Database, &db);
    if( rc ){
      //Fehlermeldung ausgeben. Wird noch implementiert.
      sqlite3_close(db);
      exit(1);
    }
    wtoci(Inhalt,SQL_string,sizeof(SQL_string));
    rc = sqlite3_exec(db,SQL_string,callback, NULL, &zErrMsg);
    if( rc!=SQLITE_OK ){
      //Erfolgsmeldung wird noch implementiert.
      sqlite3_free(zErrMsg);
    }
    sqlite3_close(db);

   //
}

Grüsse
Rainer

sirius 20. Dez 2009 09:57

Re: C: Callback Funktion aus DLL verlagern
 
Du übergibst ihn einfach als 32 bit- Pointer (void*)

R2009 20. Dez 2009 10:19

Re: C: Callback Funktion aus DLL verlagern
 
Hi Sirius,
das hab ich schon versucht.

Code:
extern "C" __declspec( dllexport ) void QtTestDll_Sqlite(char* Database,char* SQL_string, void* ptr)
{
    sqlite3 *db;
    char *zErrMsg = 0;
    int rc;
    TCHAR Inhalt[101];

    rc = sqlite3_open(Database, &db);
    if( rc ){
      //Fehlermeldung ausgeben
      //fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
      sqlite3_close(db);
      exit(1);
    }
    wtoci(Inhalt,SQL_string,sizeof(SQL_string));
    rc = sqlite3_exec(db,SQL_string,ptr, NULL, &zErrMsg);<--------hier meckert Compiler wegen ptr
    if( rc!=SQLITE_OK ){
      //fprintf(stderr, "SQL error: %s\n", zErrMsg);
      sqlite3_free(zErrMsg);
    }
    sqlite3_close(db);

   //
}
Compiler meckert:
rtest.cpp:77: error: invalid conversion from 'void*' to 'int (*)(void*, int, char**, char**)'
rtest.cpp:77: error: initializing argument 3 of 'int sqlite3_exec(sqlite3*, const char*, int (*)(void*, int, char**, char**), void*, char**)'

Wenn ich noch irgendeine Idee hätte hätte ich diesen Thread nicht eröffnet.

Grüsse
Rainer

sirius 20. Dez 2009 11:09

Re: C: Callback Funktion aus DLL verlagern
 
So viel C habe ich noch nie gemacht, aber wenn du vielleicht das hier probierst:
Code:
[s]extern "C" __declspec( dllexport ) void QtTestDll_Sqlite(char* Database,char* SQL_string,
int (*)(void*, int, char**, char**) ptr)[/s]
Edit: Ok, geht nicht durch den Compiler...

R2009 20. Dez 2009 14:43

Re: C: Callback Funktion aus DLL verlagern
 
Hi,

sieht so aus als wenn der Typecast von C++ verhindert wird. Ich nutze QT4.
Werde das Ganze nochmal mit PellsC versuchen.

Grüsse
Rainer

R2009 21. Dez 2009 10:19

Re: C: Callback Funktion aus DLL verlagern
 
Hi,
das Problem ist gelöst.
Sobald ich fertig bin werde ich das Ganze hier einstellen!

Grüsse
Rainer


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:01 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz