Callback aus C heraus

Für allgemeine Fragen zur Programmierung mit PureBasic.
Joshua314
Beiträge: 115
Registriert: 06.04.2005 22:44

Callback aus C heraus

Beitrag von Joshua314 »

Hallo zusammen,

ich habe hier folgendes Problem. Ich habe eine Anwendung die als DLL eine Steuerung zur Verfügung stellt. Diese DLL kann mir Nachrichten schicken, wenn ich vorher einen Zeiger sende wo das ganze ist. Nur muss ich mich an die C Schnittstelle halten...
wer kann mit dem Angehängten was anfangen und mir helfen ??? Mein Erster Ansatz Dazu

Code: Alles auswählen


Procedure.l CheckFunction(Library.l,Name.s)
  If GetFunction(#NCdriveCtl,Name)
    ProcedureReturn GetFunction(#NCdriveCtl,Name)
  Else
    MessageRequester("Error", "Can't find Function "+Name+" in Library.")
    End
  EndIf 
EndProcedure  


If Not OpenLibrary(#NCdriveCtl,"NCdriveCtl.dll")
  MessageRequester("Fatal Error","Can't found NcdriveCtl.dll")
  End 
EndIf  

; // Callback-Funktionen:
; 
; DS_CTL void __stdcall NcSetCallback(MsgProc  Log,
;                                     MsgProc  Info,
;                                     MsgProc  Value,
;                                     IdleProc Idle);
Prototype ProtoNcSetCallback(*Log,*Info,*Value,*Idle)
Define NcSetCallback.ProtoNcSetCallback = CheckFunction(#NCdriveCtl,"_NcSetCallback@16")

***************
Define *Nullzeiger = 0 
Declare InfoMsg(*Text)                                  ; Infofenster
NcSetCallBack(*Nullzeiger,@InfoMsg(),*Nullzeiger,*Nullzeiger)


Procedure InfoMsg(*Text)
  
  Debug "info"
  
  AddGadgetItem(#Info_Fenster,-1,PeekS(*Text))
  While CountGadgetItems(#Info_Fenster) > 10
    RemoveGadgetItem(#Info_Fenster,0)
  Wend   
  
EndProcedure


Gruß Thomas
  • Call-Back

    typedef void *MsgProc(const char *Text);

    Dient der Anzeige oder Protokollierung einer Textmeldung.

    Text Textmeldung
    typedef void *IdleProc(void);

    Dient zum periodischen Aufruf von Funktionen während Wartezeiten.

    void NcSetCallback(MsgProc Log,
    MsgProc Info,
    MsgProc Value,
    IdleProc Idle);

    Definiert Funktionen, die in der CNC-Software implementiert sind und von NCdriveCtl aufgerufen
    werden können. Für nicht benötigte Funktionen kann NULL übergeben werden.
    Log Protokollierung von Fehlermeldungen; Aufruf bei Buskommunikationsfehlern
    Info Anzeige von Informationsmeldungen; Aufruf durch PLC-Funktion ShowInfo und
    durch Latenzzeit-Trace-Funktion
    Value Anzeige eines Statuswertes; Aufruf durch PLC-Funktion ShowValue
    Idle Leerlaufverarbeitung während Wartezeiten; kontinuierlicher Aufruf (ca. alle 10 ms)
    durch NcHome, NcTravelManual, NcPositionManual, NcPositionSync,
    NcMoveAxis, NcFinishMove und NcProgramRequest
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8838
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Callback aus C heraus

Beitrag von NicTheQuick »

Ich bin mir nicht sicher, aber vielleicht brauchst du dafür eher PrototypeC.
Joshua314
Beiträge: 115
Registriert: 06.04.2005 22:44

Re: Callback aus C heraus

Beitrag von Joshua314 »

NicTheQuick hat geschrieben:Ich bin mir nicht sicher, aber vielleicht brauchst du dafür eher PrototypeC.
Hallo NicTheQuick,

nein hat mir auch nicht geholfen. Das Problem ist folgendes. Ich kann die Funktionen der DLL grundsätzlich aufrufen.
Das funktioniert. Ich muss ein C konformes Gerüst zur Verfügung stellen, dass die DLL eine Procedure von mir aufrufen kann

Ich hab Procedure und eben auch schon ProcedureC schon versucht --- beides ist gescheitert.

Gruß Thomas
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Re: Callback aus C heraus

Beitrag von edel »

Was genau funktioniert denn nicht?

cdecl duerfte falsch sein, da die Funktionen alle stdcall benutzen.
Joshua314
Beiträge: 115
Registriert: 06.04.2005 22:44

Re: Callback aus C heraus

Beitrag von Joshua314 »

edel hat geschrieben:Was genau funktioniert denn nicht?

cdecl duerfte falsch sein, da die Funktionen alle stdcall benutzen.

Also ich kann die Funktionen in der DLL ansprechen. Ich kann die Steuerung starten usw....

Bei dem Callback wird die Möglichkeit geschaffen, dass die DLL Nachrichten an mein Programm sendet.
Dazu muss aber die DLL meine Procedure kennen welche aufgerufen wird.
Anscheinend ist es aber nicht ausreichend nur Adresse der DLL mitzuteilen. Sondern meine Procedure muss
C Konform sein um aus der DLL aufgerufen zu werden.

Übergeben wird dabei ein Pointer auf einen Null terminierte Zeichenkette (String).

irgendwie mag das aber nicht ...

Gruß Thomas
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Re: Callback aus C heraus

Beitrag von edel »

Eine PB Funktion entspricht aber genau der einer C Funktion (sonst wuerden viele API Funktionen gar nicht erst funktionieren).
Daran wird es wohl nicht liegen.

Poste doch mal, z.b. auf http://pastebin.com, den C Header der DLL.
Benutzeravatar
Thorium
Beiträge: 1722
Registriert: 12.06.2005 11:15
Wohnort: Germany
Kontaktdaten:

Re: Callback aus C heraus

Beitrag von Thorium »

Joshua314 hat geschrieben: irgendwie mag das aber nicht ...
Was heisst "mag nicht"?
Kommt es zum Absturz?
Wird die Callbackprozedur nie aufgerufen?
Kommt immer ein Nullstring raus?
Kommt ein String mit unerwarteten Zeichen raus?
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.

Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke! Bild
Joshua314
Beiträge: 115
Registriert: 06.04.2005 22:44

Re: Callback aus C heraus

Beitrag von Joshua314 »

Thorium hat geschrieben:
Joshua314 hat geschrieben: irgendwie mag das aber nicht ...
Was heisst "mag nicht"?
Kommt es zum Absturz?
Wird die Callbackprozedur nie aufgerufen?
Kommt immer ein Nullstring raus?
Kommt ein String mit unerwarteten Zeichen raus?

Hallo Zusammen,

also ... ProcedureC passte auch nicht.... aber nach langen hin und her hat der Entwickler der Software bei sich entdeckt, dass er die Schnittstelle geändert hatte. Es konnte gar nicht gehen.. Ergebnis es geht ich bekomme meine Info sauber rüber. Danke erst mal an alle die mir geholfen haben. Ich werde weiter machen und werde natürlich auch wieder fragen haben.....


Gruß Thomas
Antworten