>
>  Is there any easy (or failing that, hard) way to do this?

COM aside, the first issue is that this syntax isn't quite right:


> ccall( ("SimpleLibrary.MyClass.MySum", "SimplyLibrary"), Float32, (1.2,
> 3.1))


There are a couple things to change here:
- need argument types, as a tuple, after the return type.
- `double` is equivalent to Float64 on all platforms, rather than Float32.
(for convenience, there is a `Cdouble` alias)
- argument values (or variables) need to be passed individually.

So it should look like:

ccall( ("SimpleLibrary.MyClass.MySum", "SimplyLibrary"), Cdouble, (Cdouble,
Cdouble), 1.2, 3.1)

The bigger issue here is going to be finding the function.
"SimpleLibrary.MyClass.MySum" is probably not going to work (a C symbol
won't look like that). Unless the DLL explicitly exports a C symbol, you
will probably need to query the COM registry, then the interface, and build
an appropriate dispatch table. See this article for a discussion of how to
do it from C, which could be replicated in pure Julia:
http://www.codeproject.com/Articles/13601/COM-in-plain-C

(if you only need a few functions from a given interface, that should be
 straightforward, but a generic interface is a bit involved)

On Thu, Feb 18, 2016 at 6:32 PM, Alex Mellnik <a.r.mell...@gmail.com> wrote:

> Sorry to reopen an old thread.  I'm trying to do something similar and
> haven't been able to figure it out so far.  Isaiah, I noticed that your
> COMCall.jl library is not on GitHub anymore.  Is this code still floating
> around anywhere or is there a different suggested route?
>
> In my case, I have a dll (written in c# I think) which is currently being
> called from Python using win32com
> <http://docs.activestate.com/activepython/3.3/pywin32/html/com/win32com/HTML/QuickStartClientCom.html>.
> I would like to call the dll directly from Julia without going through
> PyCall (although this works).  I don't have the source for that dll but a
> simple example is:
>
> using System;
> using System.Collections.Generic;
> using System.Linq;
> using System.Text;
> using System.Threading.Tasks;
>
> namespace SimpleLibrary
> {
>     public class MyClass
>     {
>         public static double MySum(double a, double b)
>         {
>             return a + b;
>         }
>
>         public static double NoArgs()
>         {
>             return 1.4;
>         }
>
>     }
> }
>
> Naively trying to call these with ccal like
>
> ccall( ("SimpleLibrary.MyClass.MySum", "SimplyLibrary"), Float32, (1.2,
> 3.1))
>
> gives a "wrong number of arguments" error.  Is there any easy (or failing
> that, hard) way to do this?
>

Reply via email to