Aufnahmeschnitstelle in Form einer DLL in C++ mit MFC

Forum für die programmierbare Aufnahmeschnittstelle von TVgenial sowie Fragen & Probleme rund ums Aufnehmen.
Egyptmaster
Beiträge: 5
Registriert: 25.06.2007, 15:19

Aufnahmeschnitstelle in Form einer DLL in C++ mit MFC

Beitragvon Egyptmaster » 25.06.2007, 15:26

Hi,

ich versuche gerade eine Recorderschnittstelle für TVGenial zu schreiben, welche an einen externen Recorder die Befehle weitergibt. Zu diesem Zweck haben Sie ja eine Beispiel DLL in die Installation gepackt, welche aber in Delphi geschrieben ist. Ich benötige diese aber in C++ und MFC und hab deshalb diese in eben dieser Sprache nachgebildet, leider funktioniert der Funktionsaufruf nicht, das liegt soweit ich jetzt analysiert habe an folgender Codezeile

Code: Alles auswählen

int GetCallbackInit(int THandler, int Messg)


welche in Dephi so aussieht

Code: Alles auswählen

function GetCallbackInit(MssgHandler: THandler; Messg: Integer): Integer; stdcall;


Das Problem ist das C++ den Datentyp THandle natürlich nicht kennt, was aber im grunde nur ein typedef von LongInt ist 2^32 ( int in c++ )

Trotzdem wird die Funktion nicht aufgerufen und er verweigert den Menüeintrag in TVGenial für "Aufnehmen".

Anbei hänge ich die anderen Funktionen, im Moment sollen nur Nachrichtenfenster erscheinen, was auch bis zu dem oben aufgeführten Punkt funktioniert.

Code: Alles auswählen

#include "stdafx.h"
#include "TdllSIFI.h"
//#define /*DLLEXPORT*/ _declspec(/*DLLEXPORT*/)


int InterfaceID;
int LastEnumIndex;
int LastErrroCode;
DWORD RcvMssgType;
CString TVGenialVersion;

void ShowInfo(CString msg)
{
   MessageBox(NULL,msg,_T("Info"),MB_OK);
}

/*DLLEXPORT*/ int RecorderInterfaceInitiating(int id)
{
   ShowInfo(_T("RecorderInterfaceInitiating()"));
   InterfaceID = id;
   return 0;
}

/*DLLEXPORT*/ int RecorderInterfaceShutingDown(void)
{
   ShowInfo(_T("RecorderInterfaceShutingDown"));
   return 0;
}

/*DLLEXPORT*/ void GetInterfaceDetails(char * TVGVersion, int DLLInterfaceVersion, char * aIntfName , char * aIntfVersion, char * aIntfDescript , char * aVendorURL, bool aSuppSynchronice, bool aSuppSelectable, bool aSuppSyncOther, bool aStaysAlwaysPresent)
{
   ShowInfo(_T("GetInterfaceDetails"));
   aIntfName         = "RecordingInterface";
   aIntfVersion      = "1.00.1";
   aIntfDescript      = "RecordingInterface";
   aVendorURL         = "www.bitcontrol.com";

   aSuppSynchronice   = true;
   aSuppSelectable      = true;
   aSuppSyncOther      = true;
   aStaysAlwaysPresent   = false;

   TVGenialVersion  = TVGVersion;
}

/*DLLEXPORT*/ int RecordExternalItem(CTdllSIFI * TdllSIFI)
{
   ShowInfo(_T("RecordExternalItem"));
   return 0;
}

/*DLLEXPORT*/ int DeleteExternalItem(CTdllSIFI * TdllSIFI)
{
   ShowInfo(_T("DeleteExternalItem"));
   return 0;
}

/*DLLEXPORT*/ int HandleRemindEvent(CTdllSIFI * TdllSIFI)
{
   ShowInfo(_T("HandleRemindEvent"));
   return 0;
}

/*DLLEXPORT*/ bool CanCallSetup(void)
{
   ShowInfo(_T("CanCallSetup"));
   return false;
}

/*DLLEXPORT*/
int CallSetup(void)
{
   AFX_MANAGE_STATE(AfxGetStaticModuleState());
   ShowInfo(_T("CallSetup"));
   return 0;
}

/*DLLEXPORT*/ void CreateRecorderWindow(void)
{
   ShowInfo(_T("CreateRecorderWindow"));
}

/*DLLEXPORT*/ void DestroyRecorderWindow(void)
{
   ShowInfo(_T("DestroyRecorder"));
}

/*DLLEXPORT*/ int GetCallbackInit(int THandler, int Messg)
{
   ShowInfo(_T("GetCallbackInit"));
   return 0;
}

/*DLLEXPORT*/ int SendRecordItem(CTdllSIFI * TdllSIFI)
{
   ShowInfo(_T("SendRecordItem"));
   return 0;
}

/*DLLEXPORT*/ int SendDeleteItem(CTdllSIFI * TdllSIFI)
{
   ShowInfo(_T("SendDeleteItem"));
   return 0;
}

/*DLLEXPORT*/ int EnumerateItems(void * TdllSIFI)
{
   ShowInfo(_T("EnumerateItems"));
   return 0;
}

/*DLLEXPORT*/ void GetChannelInformation(int ChnID, int ChnTVUID, char * sname, char * fname)
{
   ShowInfo(_T("GetChannelInformation"));
}

/*DLLEXPORT*/ void PlaceLastErrorCode(int LastError)
{
   ShowInfo(_T("PlaceLastErrorCode"));
}

void ExitDLL(int x)
{
   ShowInfo(_T("ExitDLL"));
}


Eventuell können Sie mir helfen.

Ich hoffe nichts im Forum übersehn zu haben, was mit diesem Thema zu tun hat.

Danke für Ihre Hilfe

Admin
Administrator
Beiträge: 5378
Registriert: 31.08.2001, 23:00
Wohnort: Germany
Kontaktdaten:

Re: Aufnahmeschnitstelle in Form einer DLL in C++ mit MFC

Beitragvon Admin » 25.06.2007, 21:32

Hallo,

THandle ist nur ein LongWord, 32 bit.

Sollte es mit einer LongWord-Lösung nicht klappen, dann erstelle ich gerne eine eigene CallBackInit2 mit diesem Parameter.

Es freut uns, dass Sie auf die Schnitstelle aufsetzen.
Arbeiten Sie bei BitCrtl ? Bitte ggf. dann direkt an mich schreiben, ich kann dann auch eine eigene EXE zum schnellen testen zusenden.

Bitte noch folgendes beachten:
Um auch UTC zu unterstützen, wird es demnächst eine Funktion geben, mit der man die Schnittstelle fest auf UTC einstellt. Dann wird in den Zeitfeldern nur der UTC enthalten sein, statt der bisherigen LocalTime.

Egyptmaster
Beiträge: 5
Registriert: 25.06.2007, 15:19

Beitragvon Egyptmaster » 02.07.2007, 07:16

Hallo,

ich hatte Ihnen Anfang letzter Woche eine Email geschrieben und mitte letzter Woche eine PM, nun wollte ich anfragen was daraus geworden ist?

Ich habe es mit einem long probiert, die Funktion wird aber nicht von TVGenial aufgerufen, also nehm ich an er akzeptiert den long wert nicht.

Ja ich arbeite bei der Firma BitCtrl Systems GmbH und würde mich über die Alternative zu der Funktion freuen.

Admin
Administrator
Beiträge: 5378
Registriert: 31.08.2001, 23:00
Wohnort: Germany
Kontaktdaten:

Beitragvon Admin » 02.07.2007, 20:52

Wir sind zzt. etwas im stress, Sie erhalten von mir ein kompilat zum testen sobald die neue funktion eingefügt ist.

Egyptmaster
Beiträge: 5
Registriert: 25.06.2007, 15:19

Beitragvon Egyptmaster » 06.07.2007, 06:55

Ich danke für Ihre Mühe :)

Egyptmaster
Beiträge: 5
Registriert: 25.06.2007, 15:19

Beitragvon Egyptmaster » 25.07.2007, 10:44

Leider funktioniert die neue Version der Funktion auch nicht eventuell mach ich auch etwas falsch bei der Implementierung dier Methode

Code: Alles auswählen

/*DLLEXPORT*/ int GetCallbackInit2( unsigned int THandler, int Messg)
{
   ShowInfo(_T("GetCallbackInit2"));
   RcvMssgType = THandler;
   return 0;
}


Bei Starten von TVGenial ruft er die Funktionen

RecorderInterfaceInitiating
GetInterfaceDetails

auf mehr leider nicht

Woran könnte das liegen?

Danke für die Hilfe

Admin
Administrator
Beiträge: 5378
Registriert: 31.08.2001, 23:00
Wohnort: Germany
Kontaktdaten:

Beitragvon Admin » 26.07.2007, 15:08

Hallo,
soweit unser Verständnis für C reicht, scheint hier die Deklaration fehlerhaft zu sein ?!
Die Windowshandles sind DWORD bzw. LongWord, also

Code: Alles auswählen

/*DLLEXPORT*/ int GetCallbackInit2( unsigned DWORD aHandler, int Messg)
{
   ShowInfo(_T("GetCallbackInit2"));
   RcvMssgType = THandler;
   return 0;
}


Nach dem Start wird wie folgt durchlaufen:

RecorderInterfaceInitiating
GetInterfaceDetails
GetInterfaceTimeSetting
GetCallbackInit
GetCallbackInit2


Dabei muss entweder GetCallbackInit oder GetCallbackInit2 deklariert sein. Es geht auch beides, das ist dann aber sinnlos.
MFG

Egyptmaster
Beiträge: 5
Registriert: 25.06.2007, 15:19

Beitragvon Egyptmaster » 30.07.2007, 07:44

Leider bricht er bei mir nach den beiden Funktionen InitiatingRecorderInterface und GetInterfaceDetails. Er ruft weder GetInterfaceTimeSettings noch GetCallBackIntit2 auf.

Die Definition eines unsigned DWORD ist nicht möglich, da DWORD bereits ein Typcast von "unsigned int" ist und der Kompiler einen unsigned unsigned int nicht wirklich zulässt.

Ich weiß nicht woran es liegt, ob die Schnitttelle von TVGenial die Funktionen nicht finden kann weil es die Datentypen nicht kennt, oder irgend ein anderes Problem vorliegt. Ich versuche weiter das Problem zu lösen, wäre aber auch über Ideen von Ihrer Seite sehr dankbar.


Zurück zu „TVgenial-Aufnahmeschnittstelle“

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste