Coring on calling VBA6 dll

T

Tom Med

I have this bit of code that cores excel. Is there something I am
doing wrong?

Option Explicit


Declare Function EbExecuteLine Lib "C:\Program Files\Common Files
\Microsoft Shared\VBA\VBA6\VBACV20.dll" ( _
ByVal stStringToExec As Long, _
ByVal Unknownn1 As Long, _
ByVal Unknownn2 As Long, _
ByVal fCheckOnly As Long) As Long


Public Function ExecuteLine(stCode As String, Optional bCheckOnly As
Boolean = False) As Boolean
Dim stCommand As String * 256
Dim lgPtr As Long

stCommand = stCode
lgPtr = StrPtr(stCommand)
ExecuteLine = EbExecuteLine(lgPtr, 0&, 0&, Abs(bCheckOnly)) = 0
End Function


Private Sub test1()
ExecuteLine ("15 + 30")
End Sub
 
P

Peter T

If you have a vb6 ActiveX you'd need to register it on the target machine,
eg with Regsrv32. The dll would also need at least one public class and
method.

Your Declare Function is for a C(++/#) dll but not a VB6. Instead you'll
need to start by creating an instance of the class and (typically) attaching
a reference to it. You can do that with CreateObject or, with late binding,
use of 'New'.

Dim mObjCls as Object

on error resume next
Set mObjCls = CreateObject("VBACV20.clsEntry")
if not mObjCls is nothing then
ExecuteLine = mObjCls.EbExecuteLine(lgPtr, 0&, 0&, Abs(bCheckOnly)) = 0

Assuming the dll is registered, set a reference to it in your vba project.
Press F2 and in Object Browser Libraries look for your dll. Hopefully you
will find "EbExecuteLine". Look for its container class name and substitute
with clsEntry in the example.

As, having set the reference, you can use Early binding and do something
like this -

Dim mObjCls as VBACV20.clsEntry ' manually type and look at intellisense
Set mObjCls = New clsEntry
etc

Curiosity - what's the StrPtr(stCommand), if say a to get the address of
something? in a normal module in the dll I'd be interested as to how that
could be used

Regards,
Peter T
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top