begin process at 2012 05 29 11:05:54
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Windows

 > 

Driver

 > 

DLL : interface IUnknown en C


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

DLL : interface IUnknown en C

vendredi 16 mars 2007 à 12:16:06 | DLL : interface IUnknown en C

Mastersam


Bonjour, je créé actuellement en driver ASIO sous forme de DLL, j'ai eu un exemple général de création d'un driver dans la SDK ASIO 2.2, mais tout est écrit en c++ et ce n'est pas très clair.

Mon problème actuellement est d'arriver à réécrire la déclaration de l'interface IUnknown dans ma dll, qui sera appelée par le logiciel qui chargera le pilote. Je dois aussi comprendre comment relier les déclaration des fonctions de l'interface aux fonctions que j'ai dans mes autres fichiers .c.

Voilà le code cpp que je voudrais traduire en C

#ifndef __ASIODRIVER_FWD_DEFINED__
#define __ASIODRIVER_FWD_DEFINED__
typedef interface IASIO IASIO;
#endif     /* __ASIODRIVER_FWD_DEFINED__ */

interface IASIO : public IUnknown
{

    virtual ASIOBool init(void *sysHandle) = 0;
    virtual void getDriverName(char *name) = 0;   
    virtual long getDriverVersion() = 0;
    virtual void getErrorMessage(char *string) = 0;   
    virtual ASIOError start() = 0;
    virtual ASIOError stop() = 0;
    virtual ASIOError getChannels(long *numInputChannels, long *numOutputChannels) = 0;
    virtual ASIOError getLatencies(long *inputLatency, long *outputLatency) = 0;
    virtual ASIOError getBufferSize(long *minSize, long *maxSize,long *preferredSize, long *granularity) = 0;
    virtual ASIOError canSampleRate(ASIOSampleRate sampleRate) = 0;
    virtual ASIOError getSampleRate(ASIOSampleRate *sampleRate) = 0;
    virtual ASIOError setSampleRate(ASIOSampleRate sampleRate) = 0;
    virtual ASIOError getClockSources(ASIOClockSource *clocks, long *numSources) = 0;
    virtual ASIOError setClockSource(long reference) = 0;
    virtual ASIOError getSamplePosition(ASIOSamples *sPos, ASIOTimeStamp *tStamp) = 0;
    virtual ASIOError getChannelInfo(ASIOChannelInfo *info) = 0;
    virtual ASIOError createBuffers(ASIOBufferInfo *bufferInfos, long numChannels,long bufferSize, ASIOCallbacks *callbacks) = 0;
    virtual ASIOError disposeBuffers() = 0;
    virtual ASIOError controlPanel() = 0;
    virtual ASIOError future(long selector,void *opt) = 0;
    virtual ASIOError outputReady() = 0;
};


Je voudrais avant tout comprendre ce fonctionnement par interface, car j'étais pour le moment habitué à l'appel de fonction dans une dll par getprocadresse.

Merci d'avance, à bientôt



samedi 17 mars 2007 à 13:40:56 | Re : DLL : interface IUnknown en C

juju12

Je suis pas sûr qu'on puisse traduire ça en C (fonction virtuelle pure...)
Mais pourquoi pas utiliser le C++ ? le COM c'est quand même très orienté objet...
Quant à la définition de IUnknown : dans <unknwn.h>
samedi 17 mars 2007 à 15:11:56 | Re : DLL : interface IUnknown en C

Mastersam


Oui je pense que je vais devoir me diriger vers le C++, d'ailleurs j'ai essayé de recompiler le driver d'exemple avec dev-cpp, mais j'ai un problème d'exportation des fonctions dans la dll. Lorsque je regarde les exports de DllRegister et DllUnregister je trouve :

; dlltool --base-file C:\DOCUME~1\isen\LOCALS~1\Temp/cca01844.base --output-exp ASIO2DIGITAL.exp --dllname ASIO2DIGITAL.dll --output-def libASIO2DIGITAL.def --no-export-all-symbols --add-stdcall-alias --exclude-symbol=DllMainCRTStartup@12 --def C:\DOCUME~1\isen\LOCALS~1\Temp/cca01844.def --output-lib libASIO2DIGITAL.a
EXPORTS
    _Z17DllRegisterServerv@0 @ 1
    _Z19DllUnregisterServerv = _Z19DllUnregisterServerv@0 @ 2
    _Z19DllUnregisterServerv@0 @ 3
    _Z17DllRegisterServerv = _Z17DllRegisterServerv@0 @ 4


les _Z17 et _Z19 proviennent d'ou ?

Pour info je déclare mes fonctions à exporter comme je le faisais en C:

# define DLLEXPORT __declspec (dllexport)

DLLEXPORT HRESULT _stdcall DllUnregisterServer()

Faut-il proceder différemment en c++ ?

Snif, je suis de nouveau un débutant





samedi 17 mars 2007 à 16:04:17 | Re : DLL : interface IUnknown en C

Mastersam

aller tiens je me répond tout seul, j'ai trouvé dans un exemple :

extern "C" HRESULT DLLEXPORT _stdcall DllRegisterServer()

extern "C" pour exporter les fonctions dans la DLL sans _Zxx, mais je ne sais toujours pas pourquoi ceci apparaissait.



samedi 17 mars 2007 à 17:49:07 | Re : DLL : interface IUnknown en C

juju12

Tes _Zxx ça doit être la décoration des noms de fonction.
Quant à extern "C" {...} c'est pour indiquer (je crois) l'utilisation de la décoration language C.
dimanche 18 mars 2007 à 12:20:59 | Re : DLL : interface IUnknown en C

racpp

Administrateur CodeS-SourceS
Salut,
On peut tout faire avec le C. Il faut juste abandonner toutes les notions de POO et le confort qu'elles apportent.
En C, une interface COM est une structure contenant un pointeur vers une table de pointeurs sur toutes les fonctions (méthodes). Cette table s'appelle la VTable. Il faudra obligatoirement passer par elle pour appeler les fonctions de l'interface incluant celles de IUnknown comme AddRef() Release() etc.
Dans un fichier .h comme unknown.h, on trouve les deux déclarations. Une pour le C++ et l'autre pour le C.
L'avantage de travailler en C, c'est qu'il permet de comprendre comment les choses fonctionnent exactement.
Voici un excellent article sur l'utilisation des objets COM en C:
COM in plain C


Cette discussion est classée dans : long, dll, interface, virtual, asioerror


Répondre à ce message

Sujets en rapport avec ce message

Accéder à l'interface d'une Dll [ par yoyocestmoi ] Bonjour,J'ai développé une petite librairie (Regular DLL sous VC++) et j'aurais voulu savoir si il existait un moyn pour voir son interface (cad métho Embarquer une dll dans un executable [ par MetalDwarf ] Voila je voudrais embarquer une dll dans un executable, c est a dire la mettre en data dans mon fichier source, et la reecrire sur le disque dur a l e besoin de précision sur les DLL [ par Mastersam ] Bonjour j'ai actuellement créé un pilote pour une interface se connectant à un port usb. En fait il s'agit d'un pilote de pilote car cette interface a utiliser l'interface d'une dll dans une MDI [ par julienbad ] Bonjour à tous! j'aurais voulu savoir si quelqu'un savait comment utiliser une dll possèdant une interface graphique (CDialog) pour l'afficher dans un Utiliser une DLL avec une interface en C [ par TheRobot ] Bonjour, Je developpe une application en VB.net et je voudrais utiliser une dll avec une interface C.A priori ce n'est pas possible car il n'y a pas d Problème d'interfacage d'une DLL écrite en C++ avec vba [ par pierrinot ] Bonjour, Je dois créer une DLL utilisable par un programme VBA. Je tombe sur un problème d'entête de fonctions. La DLL est bien compilée, mais lorsq Lenteur [ par SAKingdom ] J'ai fais une petite DLL de graphisme 2D (vous aller me dire que c'est rudimentaire. Je le sais!). Elle n'utilise aucune fonction déja toute faite (sa returnourner un entier long long [ par dlamalice ] Bonjour,j'ai codé une dll toute bete et j'aimerai que cette dernière me retour un long long (64bit) statique.Mais quand je compile la ligne return ne HELP GTK - exe portable [ par UnderFlow ] Bonjour à toutes et à tous, Afin de développer très rapidement une interface graphique en C++, j'ai utilisé Glade (éditeur graphique) et GTK (bibliot DLL COM et SAFEARRAYS [ par wismerhill__ ] Bonjour, j' essai de trouver un moyen de remplir des arrays/matrices C++ par des arrays/matrices de string/UDT/double VBA, dans le but de faire des op


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 4,196 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales