MathGroup Archive 2004

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: Net/Link: Problem with DLL (1)

  • To: mathgroup at smc.vnet.net
  • Subject: [mg48871] Re: [mg48855] Net/Link: Problem with DLL (1)
  • From: Todd Gayley <tgayley at wolfram.com>
  • Date: Mon, 21 Jun 2004 03:49:01 -0400 (EDT)
  • Sender: owner-wri-mathgroup at wolfram.com

At 03:31 AM 6/19/2004, psa wrote:
>My C type DLL (written in Compaq Visual Fortran)  returns a length 2 double
>array, and I cannot get all two of the results.
>I am confused as to when and how to supply an object in .Net/Link. I tried:
>
>  In[] =
>TestDLL2=DefineDLLFunction["testDLL2","maths0000.dll","Void",{"Double","Doub
>le","Double","Double","out Double[]"}];
>
>With what I believe is the required and it fails.
>
>In[] =  res=MakeNETObject[{0.0,0.0}]
>  «NETObject[System.Double[]]»
>In[] = TestDLL2 [1,2,3,4,res]
>  NET::netexcptn: A .NET exception occurred: System.NullReferenceException:
>Object reference not set to an instance of an
>obj.espace.DLLWrapper8.testDLL2(Double , Double , Double , Double ,
>Double[]& ).
>  $Failed
>
>Ditto, if it is it is passed res={0.0,0.0}.
>
>By pretending it is just a scalar for output array I get the first element
>only (not surprisingly?)
>In =
>TestDLL2=DefineDLLFunction["testDLL2","maths0000.dll","Void",{"Double","Doub
>le","Double","Double","out Double"}];
>In[] = TestDLL2 [1,2,3,4,res]
>In[] = res
>  -0.0229672
>
>If I am NOT doing something wrong, Is there a Windows API that returns an
>array so I can see it working?


Peter,

This can be tricky, and you are close, but the Mathematica declaration of 
your function is not correct. I presume that the C declaration looks like this:

     void testDLL2(double, double, double, double, double*);

The last parameter is an array that is filled in by the function call. You 
are declaring this as an "out Double[]" in Mathematica, but "out Double[]" 
is effectively a double**, not a double* (remember that adding "out" or 
"ref" to an argument is like adding an extra level of indirection). The 
correct declaration is:

     TestDLL2 = DefineDLLFunction["testDLL2", "maths0000.dll", "Void", 
{"Double","Double","Double","Double","out Double"}];

You can also use "Double[]" as the type, and that might be clearer:

     TestDLL2 = DefineDLLFunction["testDLL2", "maths0000.dll", "Void", 
{"Double","Double","Double","Double","Double[]"}];

You are calling it correctly, using an array object reference so that you 
have a handle to the modified array contents after the call:

     res = MakeNETObject[{0.0, 0.0}]
     TestDLL2 [1, 2, 3, 4, res]

Then NETObjectToExpression[res] will give you the result as a list.

Your function is similar to the ReverseArray example in the section on 
array arguments to DLLs in the .NET/Link User Guide.


--Todd




  • Prev by Date: Re: Overlay graphs
  • Next by Date: Permutations
  • Previous by thread: Net/Link: Problem with DLL (1)
  • Next by thread: Binomial Distribution