Link to home
Start Free TrialLog in
Avatar of JeffGrigg
JeffGrigg

asked on

How to define IDL methods, callable from VB?

Where can I find appropriate documentation on the subset of IDL (Interface Definition Language) functionality I can use when writing COM objects I want to be callable from Visual Basic.

I'm writing a few C++ utility functions in COM objects to be used by Visual Basic.  I'm sure there must be some documentation on what's valid and what's not, but I'm having a hard time finding it!  ;->

Typical error --
  "Compile error:"
  "Function or interface marked as restricted, or the function uses an Automation type not supported in Visual Basic"

Thanks!
Avatar of jrspano
jrspano
Flag of United States of America image

why don't you just let c++ do it for you? Visual C++ 6 will generate everything you need when makeing com objects.
there is also some stuff about idl in the msdn library.  it has a fractal sample.
Avatar of JeffGrigg
JeffGrigg

ASKER

Well yes, VC++ 6 will "do all the IDL and C++ code generation for me," when I right click on the interface, select Add Method, and then type in the method name, and then >>> type in all the gory IDL details of all the parameters making sure to conform to all the *unknown* rules of types that Visual Basic is able to use <<<.

It's that last little step I'm having trouble with.  ;->
Found partial answer on http://www.yukondude.com/articletamevbwithidl.asp

It contains a table I found helpful:
  Visual Basic Data Type -> IDL Data Type
  Boolean -> VARIANT_BOOL
  Byte -> unsigned char
  Collection -> _Collection*
  Currency -> CURRENCY
  Date -> DATE
  Double -> double
  Integer -> short
  Long -> long
  Object -> IDispatch*
  Recordset -> _Recordset*
  Single -> float
  String -> BSTR
  Variant -> VARIANT
  no parameters -> void
Figure 2 / Visual Basic data types and their corresponding data types in IDL
I seem to recall reading an article from Developmentor (http://www.developmentor.com) describing the limits of VB-implementable interfaces, but I can't find it.
_ _ _

On the other hand, I've found useful information in MSDN under the "oleautomation" keyword, from the MIDL language:  "The oleautomation attribute indicates that an interface is compatible with OLE Automation. The parameters and return types specified for its members must be OLE Automation-compatible, as listed in the following table."

Type -> Description
===================
boolean -> The MIDL base type boolean is incompatible with the oleautomation attribute. Use VARIANT_BOOL instead.
unsigned -> char 8-bit unsigned data item.
Double -> 64-bit IEEE floating-point number.
Float -> 32-bit IEEE floating-point number.
Int -> Integer whose size is system dependent. On 32-bit platforms, MIDL treats int as a 32-bit signed integer.
Long -> 32-bit signed integer.
Short -> 16-bit signed integer.
BSTR -> Length-prefixed string, as described in the OLE Automation topicBSTR.
CY -> (Formerly CURRENCY) 8-byte fixed-point number.
DATE -> 64-bit floating-point fractional number of days since December 30, 1899.
SCODE -> Built-in error type that corresponds to HRESULT.
Enum -> Signed integer, whose size is system-dependent. In remote operations, enum objects are treated as 16-bit unsigned entities. Applying the v1_enum attribute to an enum type definition allows enum objects to be transmitted as 32-bit entities.
IDispatch * -> Pointer to IDispatch interface (VT_DISPATCH).
IUnknown * -> Pointer to interface that is not derived from IDispatch (VT_UNKNOWN). (Any OLE interface can be represented by its IUnknown interface.)
ASKER CERTIFIED SOLUTION
Avatar of DanRollins
DanRollins
Flag of United States of America image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Good suggestion.

Thank you for tracking down and cleaning up outdated questions.  (You can have the points for that.  ;-)