2

I have created a .NET DLL which makes some methods COM visible.

One method is problematic. It looks like this:

bool Foo(byte[] a, ref byte[] b, string c, ref string d)

VB6 gives a compile error when I attempt to call the method:

Function or interface marked as restricted, or the function uses an Automation type not supported in Visual Basic.

I read that array parameters must be passed by reference, so I altered the first parameter in the signature:

bool Foo(ref byte[] a, ref byte[] b, string c, ref string d)

VB6 still gives the same compile error.

How might I alter the signature to be compatible with VB6?

starblue
  • 55,348
  • 14
  • 97
  • 151
Rik Hemsley
  • 877
  • 1
  • 10
  • 15

3 Answers3

6

Declaring the array argument with "ref" is required. Your 2nd attempt should have worked just fine, perhaps you forgot to regenerate the .tlb?

Tested code:

[ComVisible(true)]
public interface IMyInterface {
 bool Foo(ref byte[] a, ref byte[] b,string c, ref string d);
}

[ComVisible(true)]
public class MyClass : IMyInterface {
  public bool Foo(ref byte[] a, ref byte[] b, string c, ref string d) {
    throw new NotImplementedException();
  }
}


  Dim obj As ClassLibrary10.IMyInterface
  Set obj = New ClassLibrary10.MyClass
  Dim binp() As Byte
  Dim bout() As Byte
  Dim sinp As String
  Dim sout As String
  Dim retval As Boolean
  retval = obj.Foo(binp, bout, sinp, sout)
Hans Passant
  • 922,412
  • 146
  • 1,693
  • 2,536
  • Yes I had forgotten to regenerate the .tlb, thanks! As I was not longer directly mentioning the .tlb on the VB6 machine, I hadn't realised it was still being used. – Rik Hemsley Oct 24 '08 at 16:13
1

Something related to this was my problem. I have a method in C# with the following signature:

public long ProcessWiWalletTransaction(ref IWiWalletTransaction wiWalletTransaction)

VB 6 kept on complaining "Function or interface marked as restricted ..." and I assumed it was my custom object I use in the call. Turns out VB 6 can not do long, had to change the signature to:

public int ProcessWiWalletTransaction(ref IWiWalletTransaction wiWalletTransaction)
Marthinus
  • 763
  • 2
  • 5
  • 14
1

Try

[ComVisible(true)]
bool Foo([In] ref byte[] a, [In] ref byte[] b, string c, ref string d)
Tomalak
  • 332,285
  • 67
  • 532
  • 628