Dans mon application Java SWT, j'hôte un contrôle ActiveX tiers. J'utilise Oleclientsite pour le faire. Il y a 2 petites fonctions faciles que je veux appeler de Java. Voici les définitions de fonction COM: P> // Ah, this works. :-)
OleAutomation comObject = new OleAutomation("Some3rdPartyControlHere");
// Call easyFoo(42). This works. :-)
int easyFooId = 5;
comObject.invoke(easyFooId, new Variant[] { new Variant(42) });
// Call problemFoo(new float[] { 4.2, 7.0 }). This doesn't work. :-(
int problemFooId = 20;
comObject.invoke(problemFooId, [ACK! What goes here?]);
3 Réponses :
Je soupçonne qu'il n'y a pas de constructeur qui prend un float [] car Variante s ne pas avoir un membre du tableau de flotteur. Je pense que ce que vous devez faire pour que ce travail soit emballer vos flotteurs dans un Safearray (ick; et je ne sais pas comment créer un en Java). p> Vous pouvez essayer sérieusement. Votre matrice à des bits bruts et utilisez le membre d'octet * de la variante STRIT, et passez une INT qui présente le nombre d'octets afin que vous puissiez désagréaliser avec précision de l'autre côté (et je suppose que c'est tout dans le même processus et le même thread , sinon il devient plus difficile). P> [id(20)]
void problemFoo([in] VARIANT bytes /* VT_BYREF|VT_UI1 */, [in] VARIANT byteCount /* VT_UI4 */);
Même processus, même thread, mais il n'y a pas de problemfoo (octets, bytocount). L'objet COM est un contrôle tiers, celui qui ne prend qu'une variante, et la documentation indique que vous devez passer dans un tableau de flottaison.
D'accord. Espérons que cela ou l'autre réponse vous indique dans la bonne direction. Peut-être contacter le fournisseur et demander s'ils ont un code d'exemple Java.
Le fournisseur ne prend plus en charge ce composant COM, donc je ne peux donc pas obtenir de supporter d'eux. (Nous essayons de quitter ce contrôle de 3e partie, mais ces choses prennent du temps.) J'éditionnerai le membre de l'octet *. Si cela fonctionne, je vais marquer le vôtre comme la bonne réponse.
Eh bien, le contrôle de l'autre côté va s'attendre à un type spécifique. Il devrait rejeter tout ce qui ne spécifie pas ce type dans le champ VT de la variante. La chose la plus facile à faire serait de fixer un débogueur (VS ou NTSD) et tracez le démontage de l'appel de la fonction. Il devrait être assez évident où le contrôle effectue la comparaison et que vous pouvez savoir instantanément s'il veut un safearray ou quoi.
Jeff, toutes les ressources que vous pouvez me signaler à cela expliquer exactement comment faire cela? Je suis assez compétent avec un débogueur pour Java et .NET, mais plutôt abasourdi lors du débogage du code natif.
Je ne connais pas de tutoriels en ligne. Dans VS, il vous suffit de vous attacher au processus et de définir un point d'arrêt sur votre fonction qui apporte l'appel dans le composant. Ensuite, juste avant de faire appel à votre clic droit et de sélectionner "Aller à la démontage", il devrait y avoir un tas d'interop goo, mais vous finirez par vous retrouver dans la DLL active x. Je ne l'ai jamais fait de Java, alors je ne suis pas sûr de pouvoir m'aider là-bas. Si vous avez des symboles publics pour le contrôle X actif, vous pouvez définir un point d'arrêt sur la méthode directement ...
Jeff, car je ne peux pas changer le contrôle de la 3ème partie, la réponse à la réponse des octets ne fonctionne pas. J'ai utilisé l'outil Oleview pour voir le type approprié que cela s'attend à: elle dit simplement "variante". J'imagine que cela dirait «Safearray» si cela s'attendait à un tableau de sécurité, n'est-ce pas?
Qu'est-ce qui ne va pas avec la création d'une variante de variante et la remplissant avec vos valeurs de matrice flottante?
Variant[] problemFooArgs = new Variant[1]; Variant[] myFooArgs = new Variant[1]; for( int i=0; i<myFloats.length; i++) { myFooArgs [i] = new Variant(myFloats[i]); } problemFooArgs[0] = myFooArgs;
Merci, cela ne m'a pas eu pour moi que je pouvais envoyer un tableau de variantes. Je vais essayer cela et vous revenir à vous.
En ce qui concerne Safearray, je ne pense pas avoir besoin d'un safearray, car le com IDL spécifiera quand il en a besoin, non? J'ai vu des IDLS de fonctions qui nécessitent un safearray; Cet état IDL particulier dont j'ai besoin d'une variante. Quoi qu'il en soit, je vais essayer ceux-ci et je vais vous contacter.
En fait, maintenant je ne suis pas si sûr; En fait, cela peut être un safearray. Hrmmm.
En passant dans un tableau de variantes ne semble pas fonctionner. Dans le code actuel, Problème prend 2 args, les deux tableaux de flotteur.
Je vais essayer de faire un safearray et de vous revenir.
@Judah: Safearray code> est généralement la structure nécessaire pour transmettre un tableau, et elle elle-même référencée par une variante
code>. Ce que je n'ai pas trouvé, c'est comment copier un tableau de flotteurs (4 octets par flotteur) dans le
struct code> un
Safearray code>, par opposition à un tableau de char (2 octets par char)
Je l'ai Merci. J'essaie d'obtenir cela pour travailler pour flotter [] (ou même un int [] fonctionnerait). Si vous pouvez comprendre comment le faire fonctionner pour flotter [] ou INT [], je vais marquer le vôtre comme réponse.
Ouais, j'ai vu le safearray du moteur de recherche de Koders aussi. Malheureusement, la plupart des appels sont des appels autochtones, je ne sais donc pas vraiment ce qui se passe.
VONC, j'ai essayé le code suivant pour créer un safearray qui contient des flotteurs: judaHhimango.com/javavariantfloatachray.txt Cela n'a pas fonctionné. Une idée pourquoi?
Toute autre idée? Je suis vraiment coincé ici et il y a à côté de zéro documentation sur le Web pour cela.
VONC, je pense que Safearray est la mauvaise route. J'utilise l'outil OLE / COM Object Viewer dans le SDK Windows, et lorsque je le pointe sur cet objet Com, il est indiqué que la fonction prend une variante. Ne dirait-il pas Safearray si cela s'attendait à un tableau de sécurité?
Vous devez passer un tableau à flotteur. En termes com, cela signifie SA Variante avec VT défini sur vt_r4 | vt_array. Un tableau de variantes peut ne pas fonctionner car le document ne dit pas qu'il peut accepter une gamme de variantes (vt_variant | vt_array). En Java, vous devriez pouvoir utiliser Float [] comme type de paramètre. Sinon, vous pouvez toujours Appelez l'API Windows pour construire un tableau de sécurité de type souhaité . p>
Merci d'avoir répondu. J'ai vu la "lecture et l'écriture à une matrice sûre" dans l'article Java que vous connaissez. J'ai adapté ce code pour travailler pour des flotteurs et il semble fonctionner. Je posterai les résultats sous peu.
Merci pour ces retours. Je viens d'ajouter un commentaire expliquant ce que j'ai trouvé (et ce que j'ai fait pas i> trouver) sur Safearray.
Il suffit d'ajouter une autre référence à un projet Java Manipulant
Safearray code>. Peut-être que cela pourrait aider.
@JUDAH: Le problème avec '
variante code>' est que cela peut potentiellement être n'importe quoi. Néanmoins, si Safearray, avez-vous vérifié J-Integra .Intrinsyc.com / Support / COM / DOC / TYPES / INDEX.HTML ET J-INTEGRA.Intrinsyc.com/support/kb/article.aspx?id=30430 ?