Précédent   Forum des professionnels en informatique > Logiciels > Autres Logiciels > OpenOffice
OpenOffice Forum d'entraide sur OpenOffice.org. Avant de poster : La F.A.Q OpenOffice
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 11/11/2011, 08h30   #1
Invité de passage
 
Inscription : février 2011
Messages : 22
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 22
Points : 1
Points : 1
Par défaut Utilisation d'une DLL en oOo Basic

Bonjour à tous et à toutes,
je ne savais pas trop où poster ma requète, car elle mélange plusieurs sujets
Voilà, je vous expose mon problème:
je possède un scanner de codes barre miniature, utilisable sur un port COM (RS232), j'aimerais pouvoir importer les codes barres mémorisés dans celui-ci vers une base de donnée Open Office. J'aimerais le plus possible me passer d'autres programmes que Open Office.
J'ai donc trouvé le SDK contenant la DLL possédant toutes les fonctions et commandes pour piloter le scanner, y compris la gestion des ports COM. La DLL est fourni avec ses sources en VC++ 6, ainsi que des exemples d'utilisation de celle-ci en VB6, VC++, Borland C...
Ma machine tourne sous Windows 7 64 bits.
Il suffit de placer cette DLL dans le répertoire SYSTEM32 pour pouvoir l'utiliser.

Le premier test simple que j'ai voulu effectuer avec Open Office 3.3, c'est de pouvoir lire la version de la DLL et de l'afficher, en suivant l'exemple du code VB:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Declare Function csp2GetDllVersion Lib "csp2.dll" (ByVal szDllVersion As String, ByVal nMaxLength As Long) As Long

REM ...

Private Sub Form_Load()
    ' Declare the string for the dll version
    Dim bstrDllVersion As String * 30
    Dim chaine As String
    
    'Start dll logging...
    csp2SetDebugMode (1)
    
    'Get the dll version
    nRetVal = csp2GetDllVersion(bstrDllVersion, Len(bstrDllVersion))
    
   Chaine = bstrDllVersion
    
End Sub
Le code que j'ai tapé sou oOo ne génère pas d'erreurs, mais la chaine bstrDllVersion retournée par la DLL est vide

J'ai donc décidé de ressortir mon CD tout poussiéreux de VB6. Sous VB, j'arrive bien à lire la version de la DLL et à l'afficher.

Pensant que cela pouvait provenir d'un problème d'incompatibilité avec le système, j'ai essayé le même code oOo avec une machine tournant sous Windows XP, et oOo 3.3
Là, j'arrive bien à lire la version de la DLL et à l'afficher.

Sur ma machine Windows 7, j'ai donc installé Visual C 2008 express, et j'ai recompilé la DLL puisque j'avais les sources...

J'ai testé cette "nouvelle" DLL comme ci dessus (oOo sous win 7, vb6 sous win 7, oOo sous Win XP) et le fonctionnement reste identique...

Sur ce coup là, j'avoue que mes compétences sont très limitées !
Peut être ai je loupé quelque chose ?
Merci par avance de vos conseils !
pascal_06 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/11/2011, 17h48   #2
Invité de passage
 
Inscription : février 2011
Messages : 22
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 22
Points : 1
Points : 1
Bonsoir,
je viens d'essayer sur une version 32 bits de Windows 7, le problème est identique...
Je continue mes investigations !
pascal_06 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/11/2011, 21h30   #3
Invité de passage
 
Inscription : février 2011
Messages : 22
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 22
Points : 1
Points : 1
Bon....
je pense que je vais lacher l'affaire, car bcp trop complexe pour mes maigres connaissances...
J'ai encore essayé d'une autre manière, cette fois-ci avec Visual Basic express 2008, voici le message que j'obtiens : "Tentative de chargement d’un programme de format incorrect. (Exception de HRESULT : 0x8007000B)"
(http://msdn.microsoft.com/en-us/libr...exception.aspx)
Donc j'en conclue (peut être trop vite et à tort ?) que cette DLL ne peut pas fonctionner avec Windows 7)
pascal_06 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/11/2011, 08h26   #4
Invité de passage
 
Inscription : février 2011
Messages : 22
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 22
Points : 1
Points : 1
Je viens de tenter une expérience surprenante, sous Windows XP...
Le code fonctionne parfaitement SANS rien toucher, soit avec un passage par valeur dans la fonction (utilisation du mot clef byval...), et une initialisation de la variable chaine comme dans VB (Dim bstrDllVersion As String * 30)
Cependant :
- si je remplace "As String * 30" par "As String", la chaine retourné par la fonction reste vide.
- si fais comme précedemment, mais que j'initialise la variable avec une chaine quelconque, cela marche à nouveau.
- enfin, si en plus je supprime le passage par valeur dans la fonction (j'enlève "ByVal"), alors là, ça renvoie n'importe quoi, pire, OpenOffice se ferme !
Donc entre XP et Seven, il y a un fossé !
pascal_06 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/11/2011, 13h02   #5
Invité de passage
 
Inscription : février 2011
Messages : 22
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 22
Points : 1
Points : 1
Bien,
j'ai avancé un petit peu tout seul comme un grand...
Voici ce que j'ai constaté (toujours sous S E VEN 64 bits):
en placant la DLL dans le répertoire adéquat ("system32"), j'ai les problèmes décrits...
en placant la DLL sur le bureau (donc je suppose dans un répertoire quelconque ?), et bien sûr en modifiant les déclarations de fonction en conséquence (soit par exemple
Code :
Declare Function csp2GetDllVersion Lib "c:\users\toto\desktop\csp2.dll" (ByVal szDllVersion As String, ByVal nMaxLength As Long) As Long
)
et bien cela fonctionne !!!!!!!!!!!!!!!!!!!!!!!!
MIRACLE !!!!!!!!!!!
Je sèche concernant l'explication du phénomène (en espérant que ce ne soit pas le fruit du hasard !)
Pouvez-vous m'aider ?
pascal_06 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2011, 07h51   #6
Invité de passage
 
Inscription : février 2011
Messages : 22
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 22
Points : 1
Points : 1
J'ai vraiment la vague impression que ce sujet n'interresse pas grand monde
pascal_06 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2011, 21h02   #7
Modérateur
 
Avatar de sevyc64
 
Homme Yves
Développeur informatique
Inscription : janvier 2007
Messages : 3 880
Détails du profil
Informations personnelles :
Nom : Homme Yves
Âge : 39
Localisation : France, Pyrénées Atlantiques (Aquitaine)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : janvier 2007
Messages : 3 880
Points : 7 656
Points : 7 656
je ne connais rien à OOo je ne pourrais pas t'aider plus, mais,

Lorsque on passe une variable de type string à une api, cette string doit obligatoirement être déjà initialisée et de longueur suffisante, comme indiqué dans ton exemple VB6. De plus cette variable doit obligatoirement être passée par valeur.

Une string n'est pas une variable comme les autres, c'est en réalité une référence vers une zone mémoire. Le contenu de cette variable est l'adresse de la zone mémoire, mais ce que toi tu utilise en contenu est en réalité le contenu du contenu.

Pour que la dll puisse écrire dans la string (et donc la zone mémoire), cette zone mémoire doit déjà être réservée, donc la string initialisée. LA dll attend en paramètre l'adresse de la zone mémoire en question, c'est à dire le "contenu" de la variable string. Si tu passe la string en référence, tu vas en réalité passer l'adresse de l'endroit ou le programme stocke l'adresse de la zone mémoire. La dll va écrire n'importe ou écrasant les autres variables. Donc au mieux tu plante le logiciel, au pire tu crashe le système.

Pour ton problème spécifique à W7, c'est peut-être dû au fait que tu es en 64bits. Si OOo est aussi en 64bits et que ta dll est uniquement en 32bits, les 2 ne sont pas compatibles.
__________________
Sevyc64 --- Le partage est notre force

NON AU LANGAGE SMS & FAUTES VOLONTAIRES SUR LES FORUMS
sevyc64 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2012, 15h07   #8
Invité de passage
 
Inscription : février 2011
Messages : 22
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 22
Points : 1
Points : 1
Bonjour à tous,
je reviens sur le sujet, car j'ai avancé un petit peu
Alors j'ai réussi à obtenir quelque chose de cette DLL depuis OpenOffice : j'arrive bien maintenant à "lire" la version de la DLL. C'est le fait de mettre la DLL dans le répertoire systeme qui posait problème, je ne sais pas pourquoi, dans un répertoire quelconque cela fonctionne.
Maintenant, j'ai poussé un peu plus loin, car je voudrais utiliser toutes les fonctions proposées par cette DLL, donc pour interroger mon scanner.
Les exemples en VB6 et en BC (sous forme d'une appli console) fournis avec le SDK fonctionnent à merveille aussi bien sous WinXP que W7 64bits, les informations contenues dans le scanner sont bien lues. J'ai même poussé un peu plus loin en observant ce qui se passe sur le port COM à l'aide d'un "Null Modem" virtuel (com0com) et Hyperterminal.
Mais avec OpenOffice, rien ne vas plus
Impossible de communiquer avec le scanner !
J'ai fait un test simple, en suivant une séquence simple indiquée dans la documentation du SDK:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Declare Function csp2Init Lib "C:\Documents and Settings\toto\Mes documents\csp2.dll" (ByVal nComPort as long) as long
Declare Function csp2ReadData Lib "C:\Documents and Settings\toto\Mes documents\csp2.dll" as long

'...


Sub Initialisation

Dim Status as long
Dim Port as long

Port = 1

status = csp2Init (Port)

'...

End Sub

Sub Lire

Dim Status as long

status = csp2ReadData ()

'...

End Sub
La première fois que la routine Initialisation est exécutée, status = 0 est retourné ("pas d'erreur"), la ligne DTS est activée (car la led du scanner se met à clignoter en vert), mais lorsque j'exécuter la routine Lire, "COMMUNICATIONS_ERROR" m'est retourné (alors que le scanner contient des données et que ça marche avec VB ou BC). J'ai essayé d'observer ce qui se passe sur le port avec Null Modem, mais rien ne sort du port.
De plus, la DLL contient un mode "debug" qui permet de créer un fichier log de ce qui se passe... Avec VB ou BC, le fichier log se remplit, mais pas avec OpenOffice.
On dirait que le fonctionnement avec OpenOffice s'arrête à l'initialisation de la communication.
Une piste ?
Merci pour votre aide.
pascal_06 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2012, 16h34   #9
Invité de passage
 
Inscription : février 2011
Messages : 22
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 22
Points : 1
Points : 1
Bon,
je crois que j'ai une piste...
En cherchant pas mal, j'ai appris que le CS1504 = OPN2001 (qui est le succésseur).
Hors, il existe un SDK bcp plus récent pour le OPN2001, avec un DLL pour .net
ftp://support.districode.com/Produit...0124/EGFS0124/
Je vais donc faire un essai avec celle-ci !
Je vous tiens au courant.

Pascal
pascal_06 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2012, 17h07   #10
Modérateur
 
Avatar de sevyc64
 
Homme Yves
Développeur informatique
Inscription : janvier 2007
Messages : 3 880
Détails du profil
Informations personnelles :
Nom : Homme Yves
Âge : 39
Localisation : France, Pyrénées Atlantiques (Aquitaine)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : janvier 2007
Messages : 3 880
Points : 7 656
Points : 7 656
Citation:
Hors, il existe un SDK bcp plus récent pour le OPN2001, avec un DLL pour .net
A essayer, mais si le vb de OOo est le même VBA que celui de MSOffice ça ne devrait pas marcher, normalement c'est pas compatible.

Tu as tes appels dans 2 fonctions différentes, tu as essayer en mettant dans la même fonction, à la suite l'un de l'autre ?
__________________
Sevyc64 --- Le partage est notre force

NON AU LANGAGE SMS & FAUTES VOLONTAIRES SUR LES FORUMS
sevyc64 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/02/2012, 11h53   #11
Invité de passage
 
Inscription : février 2011
Messages : 22
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 22
Points : 1
Points : 1
Citation:
Envoyé par sevyc64 Voir le message
Tu as tes appels dans 2 fonctions différentes, tu as essayer en mettant dans la même fonction, à la suite l'un de l'autre ?
Bonjour Yves,
j'avoue que j'étais perplexe sur le fait de mettre les deux appels dans la même fonction, mais après avoir essayé moult possibilité, je me suis dit "pourquoi pas"... Et ça marche ! csp2ReadData () me retourne 40 (donc j'ai 40 codes enregistrés dans mon petit scanner...)
Donc c'est une grande avancée pour l'instant !
Après, pourquoi ça ne marche pas dans deux routines différentes, je n'en sais rien... En tout cas merci pour ton astuce !
Au fait, est ce que ton pseudo a avoir avec un certain "Commodore C64" ???
:') petite larme de nostalgie ! Je tiens à remercier mon grand frangin de m'avoir permis ainsi de plonger dans le monde informatique !
pascal_06 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/02/2012, 14h46   #12
Modérateur
 
Avatar de sevyc64
 
Homme Yves
Développeur informatique
Inscription : janvier 2007
Messages : 3 880
Détails du profil
Informations personnelles :
Nom : Homme Yves
Âge : 39
Localisation : France, Pyrénées Atlantiques (Aquitaine)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : janvier 2007
Messages : 3 880
Points : 7 656
Points : 7 656
Citation:
Envoyé par pascal_06 Voir le message
Bonjour Yves,
j'avoue que j'étais perplexe sur le fait de mettre les deux appels dans la même fonction, mais après avoir essayé moult possibilité, je me suis dit "pourquoi pas"... Et ça marche ! csp2ReadData () me retourne 40 (donc j'ai 40 codes enregistrés dans mon petit scanner...)
Donc c'est une grande avancée pour l'instant !
Après, pourquoi ça ne marche pas dans deux routines différentes, je n'en sais rien... En tout cas merci pour ton astuce !
A vérifier si, entre les 2 appels de tes routines, tu n'as pas un appel ou une instruction qui vient modifier, voire fermer le port COM.

Citation:
Au fait, est ce que ton pseudo a avoir avec un certain "Commodore C64" ???
:') petite larme de nostalgie ! Je tiens à remercier mon grand frangin de m'avoir permis ainsi de plonger dans le monde informatique !
Aucunement.
Perso, j'ai pas connu le Commodore C64, pas assez de moyen à l'époque, et c'était pas la culture de la famille. J'ai connu le MO5 et TO7 à l'école, et quelques années plus tard l'Amstrad CPC464 que mon frère m'avait refilé quand il s'est payé un PC (8086 à l'époque) d'occas

Ça nous rajeunis pas tout ça.
__________________
Sevyc64 --- Le partage est notre force

NON AU LANGAGE SMS & FAUTES VOLONTAIRES SUR LES FORUMS
sevyc64 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 06h43.


 
 
 
 
Partenaires

Hébergement Web