ccinfonews
Messages postés14Date d'inscriptionmardi 19 octobre 2004StatutMembreDernière intervention16 mars 2011
-
18 janv. 2008 à 19:03
ccinfonews
Messages postés14Date d'inscriptionmardi 19 octobre 2004StatutMembreDernière intervention16 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
ccinfonews
Messages postés14Date d'inscriptionmardi 19 octobre 2004StatutMembreDernière intervention16 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"
//============================================================================
// 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);
// 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;
}
cs_juju12
Messages postés966Date d'inscriptionsamedi 3 avril 2004StatutMembreDernière intervention 4 mars 20104 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.
ccinfonews
Messages postés14Date d'inscriptionmardi 19 octobre 2004StatutMembreDernière intervention16 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
Vous n’avez pas trouvé la réponse que vous recherchez ?
ccinfonews
Messages postés14Date d'inscriptionmardi 19 octobre 2004StatutMembreDernière intervention16 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);
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
cs_juju12
Messages postés966Date d'inscriptionsamedi 3 avril 2004StatutMembreDernière intervention 4 mars 20104 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é.
ccinfonews
Messages postés14Date d'inscriptionmardi 19 octobre 2004StatutMembreDernière intervention16 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
ccinfonews
Messages postés14Date d'inscriptionmardi 19 octobre 2004StatutMembreDernière intervention16 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 _