[ActiveQt] Compatibilité avec .Net pour un add-in Solidworks
Bonjour,
Je me lance dans la réalisation d'une addin pour Solidworks.
Je me demande si l’implémentation par le biais d'ActiveQt est réalisable.
Beaucoup de documentation existe pour VB.net ou C#; mais très peu pour le C++.
Avec VB.net express, j'ai fait une DLL des plus simples qui fonctionne correctement.
Solidworks API
Voici le code:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| Option Explicit On
Imports System
Imports SolidWorks.Interop.sldworks
Imports SolidWorks.Interop.swconst
Imports SolidWorks.Interop.swpublished
Public Class SwAddin
Implements SolidWorks.Interop.swpublished.SwAddin
Function ConnectToSW(ByVal ThisSW As Object, ByVal Cookie As Integer) As Boolean Implements SolidWorks.Interop.swpublished.SwAddin.ConnectToSW
MsgBox("Hello!")
ConnectToSW = True
End Function
Function DisconnectFromSW() As Boolean Implements SolidWorks.Interop.swpublished.SwAddin.DisconnectFromSW
DisconnectFromSW = True
End Function
End Class |
Et dans AssemblyInfo.vb
Code:
1 2 3 4 5 6 7 8 9 10 11 12
| Imports System.Reflection
Imports System.Runtime.InteropServices
<Assembly: AssemblyTitle("")>
<Assembly: AssemblyDescription("")>
<Assembly: AssemblyCompany("")>
<Assembly: AssemblyProduct("")>
<Assembly: AssemblyCopyright("")>
<Assembly: AssemblyTrademark("")>
<Assembly: AssemblyVersion("1.0.*")>
<Assembly: ComVisibleAttribute(True)> |
Par contre dans C++, c'est moins facile :(
J utilise les cpp/h generés avec dumpcpp depuis les .TLB. Et je fais ceci:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| #include "solidworks.h"
#include "swpublished.h"
#include "swconst.h"
using namespace SolidWorks;
using namespace SwPublished;
using namespace SwConst;
class Q_DECL_EXPORT swAddin : public ISwAddin
{
Q_OBJECT
Q_CLASSINFO("Version", "1.0")
Q_CLASSINFO("ClassID", "{7a4cffd8-cbcd-4ae9-ae7e-343e1e5710df}")
Q_CLASSINFO("Insertable", "yes")
public:
boolean ConnectToSW(ISldWorks *swApp, int cookie);
boolean DisconnectFromSW();
} |
(+ le code des fonctions dans le cpp)
J'arrive à compiler ma DLL correctement mais lorsque je charge la DLL dans solidworks, celui ci me dit qu'il ne peut la charger. En debug, Solidworks indique "RPC Server is not available".
Je n ai pas laché l'affaire. Je me suis dit que j allais commencer simple.
Donc, j'ai tenté de d'abord faire une DLL simple avec VC2010 express sans qt sans activeqt.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| #pragma once
//Import the SolidWorks
#import "sldworks.tlb" raw_interfaces_only, raw_native_types, no_namespace, named_guids
#import "swpublished.tlb" raw_interfaces_only, raw_native_types, no_namespace, named_guids
#import "swconst.tlb" raw_interfaces_only, raw_native_types, no_namespace, named_guids
using namespace System;
public class __declspec(dllexport) swAddin: public ISwAddin
{
public:
swAddin();
// ISwAddin
STDMETHOD(ConnectToSW)(IDispatch * ThisSW, LONG Identifier, VARIANT_BOOL * IsConnected);
STDMETHOD(DisconnectFromSW)(VARIANT_BOOL * IsDisconnected);
}; |
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
swAddin::swAddin()
{
}
STDMETHODIMP swAddin::ConnectToSW(IDispatch * ThisSW, LONG Cookie, VARIANT_BOOL * IsConnected)
{
MessageBox(NULL, _T("Hello world!"), _T("ConnectToSW called"), MB_OK | MB_ICONERROR);
return S_OK;
}
STDMETHODIMP swAddin::DisconnectFromSW(VARIANT_BOOL * IsDisconnected)
{
return S_OK;
} |
Et la, j arrive également à compiler mais dans Solidworks, en debug, c'est le même topo : "RPC Server is not available". (je suppose que c'est Remote Procedure Call ?).
Je crois que certains concepts m’échappent entre la simplicité du VB.net et C++... Si quelqu'un à quelques infos...
Merci d'avance pour votre lecture :)
Cordialement,