Musique midi et dll

ccinfonews Messages postés 14 Date d'inscription mardi 19 octobre 2004 Statut Membre Dernière intervention 16 mars 2011 - 18 janv. 2008 à 19:03
ccinfonews Messages postés 14 Date d'inscription mardi 19 octobre 2004 Statut Membre Dernière intervention 16 mars 2011 - 20 janv. 2008 à 16:21
bonjours à la communauté

je vais cherché à être précis (peut être trop !!!)
je programme sous VB6 (tout le monde n'est pas parfait)
j'ai développé un programme qui me permet de faire du piano bar (je suis aussi modestement un pianiste)
c'est un genre de logiciel karoké midi plus élaboré qui m'affiche également l'accompagnement piano, gère des playlistes, gère le tempo
permet de se positionner dans le morceau, gère le play en temps et en mesure, etc...
(c'est curieux chez les programmeurs ce besoin de faire des phrases !!!)

je pensais que j'allais m'en sortir avec directx géré directement dans VB
ca fonctionne pour les fonctions de base mais galère pour aller plus loin dans les fonctionnalités (exemple entre autres, le transpose ...)
j'ai fait le tour de la question et je suis obligé de créer une dll en utilisant les low-fonctions de winmm.dll pour une question de rapidité de traitement des évènemenents midi
comme la plus part des programmes midi je suppose

plutot que developper en C une dll (j'ai quelques bases mais pas assez pour aller de A jusqu'à Z) j'ai cherché une dll existante
je suis tombé sur l'excellent sequenceur de gagah
http://www.cppfrance.com/codes/SEQUENCEUR_31496.aspx

il n'utilise pas de dll mais les fonctions dans son source sont celles dont j'ai besoin et après en tatonnant je pourrais les adapter
mais voilà, je n'ai pas assez de connaissance pour me retourver dans ses sources malgré tout super bien organisées et documentées
j'ai essayé de le contacter sur cette messagerie sans réponse

autre piste, j'ai essayé aussi la dll maximum midi mais elle ne fonctionne pas avec VB
je pense (meme sur) que les fonctions sont pas déclarées au niveau de l'export pour fonctionner avec VB
et je ne suis pas assez callé pour le faire
http://www.maxmidi.com/

bref (un peu long mais ca economise les dialogues)

voila ce dont j'ai besoin
quelqu'un qui peut me donner une réponse sur une dll en C qui fonctionne sous VB6 avec des sources documentées qui :
gère les periphériques midi in out, charge un fichier midi, le joue (donc forcement avec un timer)
(plus serait la cerise sur le gateau)

ou quelqu'un qui peut contacter gagah
ou quelqu'un qui serait reprendre les sources de gagah pour isoler les fonctions et les mettre en dll
ou quelqu'un qui serait comment redéclarer les fonctions de maximum midi pour que je puissse les recomplier sous codeblock

précision "j'essaye" de programmer en C avec codeblock et le compilateur mingw

j'ai récupéré pleins de sources mais sans résultat

à voir tous les messages sur pleins de forums je pense que ca pourrait aussi en aider plus d'un
merci d'avance à tous

10 réponses

cs_juju12 Messages postés 966 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 4 mars 2010 4
18 janv. 2008 à 19:42
Tu peux mettre un bout du header de la dll max., avec les exports de fonctions, qu'on voit ce qui ne va pas?
0
ccinfonews Messages postés 14 Date d'inscription mardi 19 octobre 2004 Statut Membre Dernière intervention 16 mars 2011
18 janv. 2008 à 20:10
merci pour ta reponse

en faite il y 3 fichiers selon le type de windows (dossier \dll source)
MXMIDI16.C
MXMIDI32.C
MXMIDI95.C

et les autres fichiers (7) de fonctions en classes MFC (dossier  \mfc classes)
CMAXMIDIIN.cpp
CMAXMIDIOUT.cpp
...
en tout 7

voilà le début du fichier MXMIDI32.C du dossier dll source
attention c'est un soft payant je te mets juste le début du source
est ce que c'est ce que tu veux ?

//-----------------------------------------------------------------------------
// Maximum MIDI Programmer's ToolKit - MxMidi32.DLL
// MaxMidi Flat Thunk Module
//
// Copyright (c) Paul A. Messick, 1994-1996
//
// Written by Paul A. Messick
//
// Thunks between 32-bit applications and the 16-bit MaxMidi DLL.  Also provides
// 32-bit SMF read and write functions.
//-----------------------------------------------------------------------------
#include <windows.h>
#include "MxDLL.h"


#ifdef WIN95_DLL
__declspec(dllexport) BOOL WINAPI MxMidi_ThunkConnect32(LPSTR pszDll16, LPSTR pszDll32, HINSTANCE hInst, DWORD dwReason);
#endif


//-----------------------------------------------------------------------------
// Global Variables
//-----------------------------------------------------------------------------
PGetMaxMidiVersion32 GetMaxMidiVersion32;
PGetMidiOutDescription32 GetMidiOutDescription32;
POpenMidiOut32 OpenMidiOut32;
PResetMidiOut32 ResetMidiOut32;
PFlushMidiOut32 FlushMidiOut32;
PCloseMidiOut32 CloseMidiOut32;
PPutMidiOut32 PutMidiOut32;
PGetMidiInDescription32 GetMidiInDescription32;
POpenMidiIn32 OpenMidiIn32;
PStartMidiIn32 StartMidiIn32;
PStopMidiIn32 StopMidiIn32;
PCloseMidiIn32 CloseMidiIn32;
PGetMidiIn32 GetMidiIn32;
POpenSync32 OpenSync32;
PCloseSync32 CloseSync32;
PStopSync32 StopSync32;
PStartSync32 StartSync32;
PPauseSync32 PauseSync32;
PReStartSync32 ReStartSync32;
PSetTempo32 SetTempo32;
PSetResolution32 SetResolution32;
PGetTempo32 GetTempo32;
PGetResolution32 GetResolution32;
PGetPosition32 GetPosition32;


//*** V1.55 ***
PGetMidiInFilters32 GetMidiInFilters32;
PSetMidiInFilters32 SetMidiInFilters32;
PGetMidiOutFilters32 GetMidiOutFilters32;
PSetMidiOutFilters32 SetMidiOutFilters32;


#ifndef WIN95_DLL
BOOL isNT = FALSE;


//============================================================================
// Internal Functions
//============================================================================
//----------------------------------------------------------------------------
// IsWinNT
//
// Returns TRUE if running in any version of Windows NT, or FALSE if not.
// Since the ToolKit does not run in Win3.1, FALSE implies that the OS is
// Win95.
//----------------------------------------------------------------------------
BOOL IsWinNT(void)
{
 DWORD dwVersion;
 BOOL rc = FALSE;
 
 dwVersion = GetVersion();
 
 // if upper bit set, this is NT
 if(dwVersion < 0x80000000)
  rc = TRUE;


 // otherwise, it must be Win95
 return rc;
}
#endif


//----------------------------------------------------------------------------
// DllMain
//
// This is the 32-bit equivalent to "LibMain".  It connects with the 16-bit
// DLL through the thunk layer.
//----------------------------------------------------------------------------
__declspec(dllexport) BOOL WINAPI DllMain(HINSTANCE hInst, DWORD dwReason, LPVOID lpReserved)
{
#ifndef WIN95_DLL
 HMODULE hDLLModule;
 WNDCLASS wndclass;  // Structure used to register class


 // determine if this is NT or Win95
 isNT = IsWinNT();
#endif


#ifdef WIN95_DLL // thunk to MxMidi16
 // call the entry point for the thunk layer
 if(!(MxMidi_ThunkConnect32("MXMIDI16.DLL", "MXMIDI95.DLL", hInst, dwReason)))
  return FALSE;
#endif
 
 switch(dwReason)
 {
  // DLL is attaching to the address space of the current process.
  case DLL_PROCESS_ATTACH:
#ifndef WIN95_DLL
   if(isNT)
   {
    // use local functions (and windows) for NT
    // setup window class parameters. Notice that this window is NEVER
    // displayed, so the display-specific parameters are set to NULL.
    wndclass.style        = CS_GLOBALCLASS;
    wndclass.lpfnWndProc   = MidiInProc;
    wndclass.cbClsExtra    = 0;
    wndclass.cbWndExtra    = 0;
    wndclass.hInstance     = hInst;
    wndclass.hIcon        = NULL;
    wndclass.hCursor       = NULL;
    wndclass.hbrBackground = NULL;
    wndclass.lpszMenuName  = NULL;
    wndclass.lpszClassName = MIDIINCLASS;
    RegisterClass(&wndclass);


    // setup hidden midi out window class parameters.  Notice that
    // this window is NEVER displayed, so the display-specific
    // parameters are set to NULL.
    wndclass.style        = CS_GLOBALCLASS;
    wndclass.lpfnWndProc   = MidiOutProc;
    wndclass.cbClsExtra    = 0;
    wndclass.cbWndExtra    = 0;
    wndclass.hInstance     = hInst;
    wndclass.hIcon        = NULL;
    wndclass.hCursor       = NULL;
    wndclass.hbrBackground = NULL;
    wndclass.lpszMenuName  = NULL;
    wndclass.lpszClassName = MIDIOUTCLASS;
    RegisterClass(&wndclass);


    hDLLModule = hInst;
   }
   else
   {
    hDLLModule = LoadLibrary("MxMidi95.dll");
    if(hDLLModule == NULL)
     return FALSE;
   }


   // for MxMidi32.dll get addresses for all of the local functions in MxMidi32.dll if NT, or from MxMidi95 if Win95
   GetMaxMidiVersion32 = (PGetMaxMidiVersion32)GetProcAddress(hDLLModule, "[mailto:_GetMaxMidiVersionEx@0 _GetMaxMidiVersionEx@0]");
   GetMidiOutDescription32 = (PGetMidiOutDescription32)GetProcAddress(hDLLModule, "[mailto:_GetMidiOutDescriptionEx@8 _GetMidiOutDescriptionEx@8]");
   OpenMidiOut32 = (POpenMidiOut32)GetProcAddress(hDLLModule, "[mailto:_OpenMidiOutEx@16 _OpenMidiOutEx@16]");
   ResetMidiOut32 = (PResetMidiOut32)GetProcAddress(hDLLModule, "[mailto:_ResetMidiOutEx@4 _ResetMidiOutEx@4]");
   FlushMidiOut32 = (PFlushMidiOut32)GetProcAddress(hDLLModule, "[mailto:_FlushMidiOutEx@4 _FlushMidiOutEx@4]");
   CloseMidiOut32 = (PCloseMidiOut32)GetProcAddress(hDLLModule, "[mailto:_CloseMidiOutEx@4 _CloseMidiOutEx@4]");
   PutMidiOut32 = (PPutMidiOut32)GetProcAddress(hDLLModule, "[mailto:_PutMidiOutEx@8 _PutMidiOutEx@8]");
   GetMidiInDescription32 = (PGetMidiInDescription32)GetProcAddress(hDLLModule, "[mailto:_GetMidiInDescriptionEx@8 _GetMidiInDescriptionEx@8]");
   OpenMidiIn32 = (POpenMidiIn32)GetProcAddress(hDLLModule, "[mailto:_OpenMidiInEx@16 _OpenMidiInEx@16]");
   StartMidiIn32 = (PStartMidiIn32)GetProcAddress(hDLLModule, "[mailto:_StartMidiInEx@4 _StartMidiInEx@4]");
   StopMidiIn32 = (PStopMidiIn32)GetProcAddress(hDLLModule, "[mailto:_StopMidiInEx@4 _StopMidiInEx@4]");
   CloseMidiIn32 = (PCloseMidiIn32)GetProcAddress(hDLLModule, "[mailto:_CloseMidiInEx@4 _CloseMidiInEx@4]");
   GetMidiIn32 = (PGetMidiIn32)GetProcAddress(hDLLModule, "[mailto:_GetMidiInEx@4 _GetMidiInEx@4]");
   OpenSync32 = (POpenSync32)GetProcAddress(hDLLModule, "[mailto:_OpenSyncEx@16 _OpenSyncEx@16]");
   CloseSync32 = (PCloseSync32)GetProcAddress(hDLLModule, "[mailto:_CloseSyncEx@4 _CloseSyncEx@4]");
   StopSync32 = (PStopSync32)GetProcAddress(hDLLModule, "[mailto:_StopSyncEx@4 _StopSyncEx@4]");
   StartSync32 = (PStartSync32)GetProcAddress(hDLLModule, "[mailto:_StartSyncEx@4 _StartSyncEx@4]");
   PauseSync32 = (PPauseSync32)GetProcAddress(hDLLModule, "[mailto:_PauseSyncEx@8 _PauseSyncEx@8]");
   ReStartSync32 = (PReStartSync32)GetProcAddress(hDLLModule, "[mailto:_ReStartSyncEx@4 _ReStartSyncEx@4]");
   SetTempo32 = (PSetTempo32)GetProcAddress(hDLLModule, "[mailto:_SetTempoEx@8 _SetTempoEx@8]");
   SetResolution32 = (PSetResolution32)GetProcAddress(hDLLModule, "[mailto:_SetResolutionEx@8 _SetResolutionEx@8]");
   GetTempo32 = (PGetTempo32)GetProcAddress(hDLLModule, "[mailto:_GetTempoEx@4 _GetTempoEx@4]");
   GetResolution32 = (PGetResolution32)GetProcAddress(hDLLModule, "[mailto:_GetResolutionEx@4 _GetResolutionEx@4]");
   GetPosition32 = (PGetPosition32)GetProcAddress(hDLLModule, "[mailto:_GetPositionEx@8 _GetPositionEx@8]");


   // *** V1.55 ***
   GetMidiInFilters32 = (PGetMidiInFilters32)GetProcAddress(hDLLModule, "[mailto:_GetMidiInFiltersEx@4 _GetMidiInFiltersEx@4]");
   SetMidiInFilters32 = (PSetMidiInFilters32)GetProcAddress(hDLLModule, "[mailto:_SetMidiInFiltersEx@8 _SetMidiInFiltersEx@8]");
   GetMidiOutFilters32 = (PGetMidiOutFilters32)GetProcAddress(hDLLModule, "[mailto:_GetMidiOutFiltersEx@4 _GetMidiOutFiltersEx@4]");
   SetMidiOutFilters32 = (PSetMidiOutFilters32)GetProcAddress(hDLLModule, "[mailto:_SetMidiOutFiltersEx@8 _SetMidiOutFiltersEx@8]");


   // bail out if fcns can't be found
   if(GetMaxMidiVersion32 == NULL)
    return FALSE;
#else
   // for MxMidi95.dll get addresses for the thunks to the functions in MxMidi16.dll
   GetMaxMidiVersion32 = GetMaxMidiVersion16;
   GetMidiOutDescription32 = GetMidiOutDescription16;
   OpenMidiOut32 = OpenMidiOut16;
   ResetMidiOut32 = ResetMidiOut16;
   FlushMidiOut32 = FlushMidiOut16;
   CloseMidiOut32 = CloseMidiOut16;
   PutMidiOut32 = PutMidiOut16;
   GetMidiInDescription32 = GetMidiInDescription16;
   OpenMidiIn32 = OpenMidiIn16;
   StartMidiIn32 = StartMidiIn16;
   StopMidiIn32  = StopMidiIn16;
   CloseMidiIn32 = CloseMidiIn16;
   GetMidiIn32 = GetMidiIn16;
   OpenSync32 = OpenSync16;
   CloseSync32 = CloseSync16;
   StopSync32 = StopSync16;
   StartSync32 = StartSync16;
   PauseSync32 = PauseSync16;
   ReStartSync32 = ReStartSync16;
   SetTempo32 = SetTempo16;
   SetResolution32 = SetResolution16;
   GetTempo32 = GetTempo16;
   GetResolution32 = GetResolution16;
   GetPosition32 = GetPosition16;
   
   // *** V1.55 ***
   GetMidiInFilters32 = GetMidiInFilters16;
   SetMidiInFilters32 = SetMidiInFilters16;
   GetMidiOutFilters32 = GetMidiOutFilters16;
   SetMidiOutFilters32 = SetMidiOutFilters16;


#endif // WIN95_DLL
   break;


  // The calling process is detaching the DLL from its address space.
  case DLL_PROCESS_DETACH:
#ifndef WIN95_DLL
   if(isNT)
   {
    // only registered if NT
    UnregisterClass(MIDIINCLASS, hInst);
    UnregisterClass(MIDIOUTCLASS, hInst);
   }
#endif
   break;


  // A new thread is being created in the current process.
  case DLL_THREAD_ATTACH:
   break;


  // A thread is exiting cleanly.
  case DLL_THREAD_DETACH:
   break;
 }


 return TRUE;
}


 
0
cs_juju12 Messages postés 966 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 4 mars 2010 4
19 janv. 2008 à 00:40
En fait je voulais voir les définitions des fonctions exportées pour la convention d'appel, je crois que VB n'accepte que le __stdcall (== WINAPI normalement); il y a aussi des petits problèmes pour travailler avec les chaînes de caractères mais sinon ça devrait marcher...Qu'est-ce-qui ne va pas avec VB? T'as bien respecté la décoration des noms pour les fonctions? Sinon il est possible que ces fonctions ne soient pas exportées, dans ce cas tu les retrouve avec GetProcAddress comme dans le code en fait.
0
ccinfonews Messages postés 14 Date d'inscription mardi 19 octobre 2004 Statut Membre Dernière intervention 16 mars 2011
19 janv. 2008 à 08:08
effectivement il faut déclarer les fonctions avec __stdcall et quand on compile il crée un référence avec le bon nom de la fonction et une autre avec une décoration ([mailto:fonction@0 fonction@0] par exemple)
mais dans cette DLL il n'y a pas ces 2 déclarations c'est peut etre une piste

dans VB on déclare
declare function (le nom de la fonction) lib (le nom de la dll) alias ([mailto:fonction@0 fonction@0]) (byval param as ....

j'ai oublié de dire que j'ai contacté l'auteur paul Messick (adresse sur le site) pour lui demander des explications mais j'ai un rejet du mail
faut dire que le developpement date de 1996 mais le produit est toujours en vente

merci
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_juju12 Messages postés 966 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 4 mars 2010 4
19 janv. 2008 à 18:27
Mais tu as un exemple de définition (dans un header de la dll probablement) d'une fonction que tu souhaiterais utiliser avec VB?
0
ccinfonews Messages postés 14 Date d'inscription mardi 19 octobre 2004 Statut Membre Dernière intervention 16 mars 2011
19 janv. 2008 à 19:30
hello juju

je comprends ce que tu me demandes et après avoir pas mal cherché

il y a un dossier \include avec des fichiers.h qui portent le même nom que les fichiers du dossier \MFC classes
et 2 autres fichiers maxmidi.h et mxdll.h

dans maxmidi.h il y a par exemple

//-----------------------------------------------------------------------------
// Exported MaxMidi DLL entry point function prototypes
//-----------------------------------------------------------------------------
PREFIX WORD WINAPI EXPORT GetMaxMidiVersion(void);


PREFIX UINT WINAPI EXPORT GetNumOutDevices(void);
PREFIX BOOL WINAPI EXPORT GetMidiOutDescription(WORD wDeviceID, LPSTR lpzDesc);
PREFIX HMOUT WINAPI EXPORT OpenMidiOut(HWND hWnd, WORD wDeviceID, HSYNC hSync, DWORD dwFlags);
PREFIX WORD WINAPI EXPORT ResetMidiOut(HMOUT hMidiOut);
PREFIX void WINAPI EXPORT FlushMidiOut(HMOUT hMidiOut);
PREFIX WORD WINAPI EXPORT CloseMidiOut(HMOUT hMidiOut);
PREFIX WORD WINAPI EXPORT PutMidiOut(HMOUT hMidiOut, LPMIDIEVENT lpMidiEvent);

mais aussi dans mxdll.h il y a

//-----------------------------------------------------------------------------
// MxMidi16 16-bit API
//-----------------------------------------------------------------------------
#ifndef WIN32
PREFIX void WINAPI EXPORT FreeGlobalMem16(void FAR* gMem);
#endif


PREFIX WORD WINAPI EXPORT GetMaxMidiVersion16(void);


PREFIX BOOL WINAPI EXPORT GetMidiOutDescription16(WORD wDeviceID, LPSTR lpzDesc);
PREFIX HMOUT WINAPI EXPORT OpenMidiOut16(HWND hWnd, WORD wDeviceID, HSYNC hSync, DWORD dwFlags);
PREFIX WORD WINAPI EXPORT ResetMidiOut16(HMOUT hMidiOut);
PREFIX void WINAPI EXPORT FlushMidiOut16(HMOUT hMidiOut);
PREFIX WORD WINAPI EXPORT CloseMidiOut16(HMOUT hMidiOut);
PREFIX WORD WINAPI EXPORT PutMidiOut16(HMOUT hMidiOut, LPMIDIEVENT lpMidiEvent);






je pense que le 2eme code ne sert que si on compile que pour du 16 bit
mais comme je n'ai pas encore acquis les connaissances c'est balaise pour moi et je n'ai pas VC++ pour recompiler

est-ce que ca t'inspire ?

merci
0
cs_juju12 Messages postés 966 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 4 mars 2010 4
19 janv. 2008 à 20:36
C'est ce que je voulais...
Effectivement les fonctions sont bien exportées en __stdcall (WINAPI est équivalent); logiquement, VB devrait pas avoir de problèmes (à part pour les strings faut un peu adapter), et tu ne devrais pas avoir à recompiler (du moins pour ce que je vois). Pourquoi n'arrives-tu pas à les utiliser? Je veux dire, est-ce une erreur à l'exécution, du genre fonction introuvable? Quel message d'erreur, pour GetNumOutDevices par exemple? Pour avoir le nom correct des fonctions exportées, tu peux le voir avec ViewDependencies (click droit sur la dll, si t'as VB6 tu devrais avoir cet utilitaire).

Ah maintenant que j'y pense si tu le souhaites tu peux m'envoyer la dll par mail (j'ai bien compris qu'elle était payante, pas d'inquiétude, je la supprimerai dès que j'aurais réussi (ou pas) à la faire marcher); dis-le moi dans ce cas je t'enverrai mon mail par messag privé.
0
ccinfonews Messages postés 14 Date d'inscription mardi 19 octobre 2004 Statut Membre Dernière intervention 16 mars 2011
20 janv. 2008 à 10:36
hello juju

en faite j'ai pas ete assez précis dans ce que je t'ai dis dans un des post precedent mais sans incidence sur la description de mon pb
en général je liste les fonctions simplement en ouvrant la dll dans notepad
la je cherche le nom des fonctions et jusqu'à présent j'avais toujours 2 déclarations
1 "normale" et une avec décoration et je codais dans vb par exemple

Declare Function GetNumOutDevices Lib "mxmidi32.dll" Alias "[mailto:GetNumOutDevices@0 GetNumOutDevices@0]" () As Integer

ca a toujours fonctionné
sauf que la (et c'est ma rectification et une piste à mon pb) je n'ai qu'une déclaration - la fonction avec décoration


et dans vb tu ne peux pas faire
Declare Function [mailto:GetNumOutDevices@0 GetNumOutDevices@0] Lib "mxmidi32.dll" () As Integer

il te renvoi un message d'arreur : le @0 ne lui plait pas


avec ce pb j'ai pensé que je bidouillais trop et j'ai utilisé dependency walker (pour faire pro) pour voir les fonctions de la dite dll
il m'indique bien qu'il existe la fonction [mailto:GetNumOutDevices@0 GetNumOutDevices@0]

donc pas assez pour faire ce source

---------------------------
Declare Function GetNumOutDevices Lib "mxmidi32.dll" Alias "[mailto:GetNumOutDevices@0 GetNumOutDevices@0]" () As Integer

Private Sub cmd_Click(Index As Integer)
      MsgBox Format$(GetNumOutDevices())
End Sub
-------------------------------

il me retourne bien evidement le message "point d'entrée [mailto:GetNumOutDevices@0 GetNumOutDevices@0] d'une dll introuvable dans mxmidi32.dll"

qui est typique d'une mauvaise déclaration de fonction en dll
puisque GetNumOutDevices n'existe pas

comme proposé si tu veux on peut developper certaine partie en message privé
merci encore
0
cs_juju12 Messages postés 966 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 4 mars 2010 4
20 janv. 2008 à 12:59
OK la suite en privé...
0
ccinfonews Messages postés 14 Date d'inscription mardi 19 octobre 2004 Statut Membre Dernière intervention 16 mars 2011
20 janv. 2008 à 16:21
hello juju


 


tu viens de trouver la solution et je viens de découvrir mon erreur


 


apparemment (mais je ne perdrais pas mon temps à faire les tests qui confirmeront)
quand dans une dll il y a les deux déclarations avec et sans décoration par exemple GetNumOutDevices et [mailto:GetNumOutDevices@0 GetNumOutDevices@0]


on peut écrire sans pb dans vb (je l'ai testé dans un commencement de développement de cette dll) et c'est le départ de mon erreur




 


Declare Function GetNumOutDevices Lib "mxmidi32.dll" Alias "GetNumOutDevices@0" () As Long


 


mais quand il n'y a qu'un seule déclaration en l'occurrence [mailto:GetNumOutDevices@0 GetNumOutDevices@0] il ne faut pas oublier l'underscore [mailto:_GetNumOutDevices@0 _GetNumOutDevices@0]
telle que c'est déclarée (vu par DependencyWalker)
sinon effectivement ca ne marche pas et comme tu as vu, toutes les déclarations de la dll ont un _

encore un grand merci à toi et à ta patience
0
Rejoignez-nous