tags:

views:

154

answers:

1

I have been trying to get the following VB code running in C# for hours now. I keep getting a Value does not fall within the expected range. exception on the CreateStroke() call. Also, here is the Microsoft documentation with a C++ version as well.

Option Explicit
Dim theInkCollector As InkCollector

Private Sub Form_Load()
    Set theInkCollector = New InkCollector
    theInkCollector.hWnd = Me.hWnd
    theInkCollector.Enabled = True

    //Create a set of three points, stored as x1, y1, x2, y2, x3, y3
    //in an array of six Long elements, starting at index 0.
    Dim ptStrokePoints(5) As Long
    ptStrokePoints(0) = 200
    ptStrokePoints(1) = 200
    ptStrokePoints(2) = 400
    ptStrokePoints(3) = 600
    ptStrokePoints(4) = 900
    ptStrokePoints(5) = 300

    //The description value is an unused placeholder.
    Dim theDescription As Variant 
    Dim theStroke As IInkStrokeDisp
  Set theStroke = theInkCollector.Ink.CreateStroke(ptStrokePoints, theDescription)
End Sub

Here is what I have:

MSINKAUTLib.InkCollector collector = new MSINKAUTLib.InkCollector();
collector.hWnd = (int)(this.Handle);
collector.Enabled = true;

long[] pts = new long[6];
pts[0] = 200;
pts[1] = 200;
pts[2] = 400;
pts[3] = 600;
pts[4] = 900;
pts[5] = 300;

collector.Ink.CreateStroke(pts, new object());
+2  A: 

That looks like the following error from the docs:

E_INVALIDARG - Invalid VARIANT type (only VT_ARRAY | VT_I4 supported).

The C# long type is a 64-bit integer, so you are passing a VT_ARRAY | VT_I8 (not VT_I4).

Change your pts declaration to:

int[] pts = new int[6];

and you should be good to go. (int is the C# 32-bit integer type.)

itowlson
yes i have tried that... no luck with it =(
Mark
Hmm, weird. I guess it's vaguely possible the reserved parameter is being validated in some way: does passing `null` instead of `new object()` help? Also, I guess depending on how the function was imported the marshalling might be awry, though in that case I'd expect a different error. Could you post the signature of the tlbimp'ed method, including any MarshalAs attributes? The exception is an ArgumentException right?
itowlson
Its not an ArgumentException, and no setting it to null is the first thing I tried... I really don't understand why its complaining. I have a feeling it is because the description needs to be valid.
Mark
However, I just managed to get around the issue by using StrokeCollection.Save() and Load()... this allows me to avoid having to create the strokes manually.
Mark