Registration Free Com in Excel
-
Hey Everyone, I have been searching the web for days to try and find a potential solution to my problem, and so far I have only gathered bits and pieces of a potential solution. I need to be able to make API calls to a CAD program from an Excel macro. The CAD program is called NX. It was developed by Siemens. They have an API called NXOpen that was written in VB.NET. I have tried referencing the appropriate DLL in Excel, however the DLL is not registered and nor can it be in my limited development environment. I do not have registry access. If I am able to pull this off I would like to distribute the workbook to my co-workers as well. So I have been exploring the possibility of using Registration Free COM in Excel 2010 (Windows 7 64 bit) to make the API calls I need from Excel. To try and do this I was going to use the following code to instantiate an object that points to the manifest for the NXOpen.dll file. I want to access a subroutine in the DLL called "Highlight". Also, from what I have read I will also need the dlls CLSID to reference in the manifest as well. That I don't know how to get. Any help would be very appreciated. Thank you.
Sub EXCELNX()
Dim actCtx As Object Set actCtx = CreateObject("Microsoft.Windows.ActCtx") actCtx.Manifest = ThisWorkbook.Path & "\\NXOpen.dll.manifest" Dim myNX As Object Set myNX = actCtx.CreateObject("Highlight")
End Sub
If the API was written in .NET, it might not be exposed as a COM library. There are specific steps you have to take to make that happen: Exposing .NET Components to COM[^] If there isn't a COM API available, you have a couple of choices. You could write your own wrapper API in .NET, and expose that wrapper as a COM-callable library. Or, you could use VSTO to write a .NET Execl add-in[^], and call the API from that.
"These people looked deep within my soul and assigned me a number based on the order in which I joined." - Homer
-
If the API was written in .NET, it might not be exposed as a COM library. There are specific steps you have to take to make that happen: Exposing .NET Components to COM[^] If there isn't a COM API available, you have a couple of choices. You could write your own wrapper API in .NET, and expose that wrapper as a COM-callable library. Or, you could use VSTO to write a .NET Execl add-in[^], and call the API from that.
"These people looked deep within my soul and assigned me a number based on the order in which I joined." - Homer
Okay, so if I create my own Library exposing the .NET calls to be consumed in VBA I can reference this Library in Excel? I have Visual Studio so I can build DLL files and anything that does not require installation (or registry access) to run. If I can consolidate the functionality to an Excel workbook that would be great. Which is why I was thinking of Reg Free COM. How can I call the Library in Excel VBA? Edit: I can't build executables either. IT is picky about what we can and cannot do. However Excel is free game.
-
Okay, so if I create my own Library exposing the .NET calls to be consumed in VBA I can reference this Library in Excel? I have Visual Studio so I can build DLL files and anything that does not require installation (or registry access) to run. If I can consolidate the functionality to an Excel workbook that would be great. Which is why I was thinking of Reg Free COM. How can I call the Library in Excel VBA? Edit: I can't build executables either. IT is picky about what we can and cannot do. However Excel is free game.
Yes, if you follow the instructions in the article I linked to, you can create your own .NET library to call the API, and then call that as a COM component from Excel. Or you could use VSTO to create an Excel add-in or workbook with .NET code running behind it. But it sounds like you might be locked out from doing that as well.
"These people looked deep within my soul and assigned me a number based on the order in which I joined." - Homer
-
Yes, if you follow the instructions in the article I linked to, you can create your own .NET library to call the API, and then call that as a COM component from Excel. Or you could use VSTO to create an Excel add-in or workbook with .NET code running behind it. But it sounds like you might be locked out from doing that as well.
"These people looked deep within my soul and assigned me a number based on the order in which I joined." - Homer
Hello, in the article you linked in your post, there are two different GUIDs. What are the differences in the 2, and which ones should I be using? Also, in the article to call the COM object he was able to reference the COM wrapper class built to expose the .NET calls to VBA in Visual Studio. I am trying to do this in Excel, where I can't simply reference the dll. Can somebody tell me how I can call COM objects in Excel? Here is my code for the COM Wrapper Class:
Imports System
Imports System.Collections.Generic
Imports System.Runtime.InteropServices
Imports NXOpen
Imports NXOpen.UF
Imports NXOpen.AssembliesNamespace ExcelNXInterface
\_ Public Interface \_ExcelNXInterface Sub HighlightCompTag(ByRef tag As Long) Sub Echo(ByVal output As String) End Interface Public Class ExcelNXInterface Implements \_ExcelNXInterface Public \_ExcelNXInterface Dim theSession As Session = Session.GetSession() Dim ufs As UFSession = UFSession.GetUFSession() Public Sub HighlightCompTag(ByRef tag As Long) Implements \_ExcelNXInterface.HighlightCompTag 'Cycles through component objects by tag in NX, and then when finding it, highlights it. Try ufs.Disp.SetHighlight(tag, 1) Echo("Component(s) Highlighted...") Catch e As NXException Echo("NX Exception is: {0} " + e.Message) Catch e As Exception Echo("Exception is: {0} " & e.Message) Echo("DONE!" & vbLf) End Try End Sub Sub Echo(ByVal output As String) Implements \_ExcelNXInterface.Echo theSession.ListingWindow.Open() theSession.ListingWindow.WriteLine(output) theSession.LogFile.WriteLine(output) End Sub End Class
End Namespace
Here is the manifest I built to reference in Excel:
-
Hello, in the article you linked in your post, there are two different GUIDs. What are the differences in the 2, and which ones should I be using? Also, in the article to call the COM object he was able to reference the COM wrapper class built to expose the .NET calls to VBA in Visual Studio. I am trying to do this in Excel, where I can't simply reference the dll. Can somebody tell me how I can call COM objects in Excel? Here is my code for the COM Wrapper Class:
Imports System
Imports System.Collections.Generic
Imports System.Runtime.InteropServices
Imports NXOpen
Imports NXOpen.UF
Imports NXOpen.AssembliesNamespace ExcelNXInterface
\_ Public Interface \_ExcelNXInterface Sub HighlightCompTag(ByRef tag As Long) Sub Echo(ByVal output As String) End Interface Public Class ExcelNXInterface Implements \_ExcelNXInterface Public \_ExcelNXInterface Dim theSession As Session = Session.GetSession() Dim ufs As UFSession = UFSession.GetUFSession() Public Sub HighlightCompTag(ByRef tag As Long) Implements \_ExcelNXInterface.HighlightCompTag 'Cycles through component objects by tag in NX, and then when finding it, highlights it. Try ufs.Disp.SetHighlight(tag, 1) Echo("Component(s) Highlighted...") Catch e As NXException Echo("NX Exception is: {0} " + e.Message) Catch e As Exception Echo("Exception is: {0} " & e.Message) Echo("DONE!" & vbLf) End Try End Sub Sub Echo(ByVal output As String) Implements \_ExcelNXInterface.Echo theSession.ListingWindow.Open() theSession.ListingWindow.WriteLine(output) theSession.LogFile.WriteLine(output) End Sub End Class
End Namespace
Here is the manifest I built to reference in Excel:
Obviously, you need to create your own Guids. :) I believe you'd use the Guid from the
IDispatch
interface, but it's a long time since I've had to touch COM at that level.Member 12336929 wrote:
progid="ExcelNXInterface.Open" Set myNX = actCtx.CreateObject("ExcelNXInterface.Open")
That doesn't seem to match the name of the class you created. Did you mean to use
ExcelNXInterface.ExcelNXInterface
instead?
"These people looked deep within my soul and assigned me a number based on the order in which I joined." - Homer
-
Obviously, you need to create your own Guids. :) I believe you'd use the Guid from the
IDispatch
interface, but it's a long time since I've had to touch COM at that level.Member 12336929 wrote:
progid="ExcelNXInterface.Open" Set myNX = actCtx.CreateObject("ExcelNXInterface.Open")
That doesn't seem to match the name of the class you created. Did you mean to use
ExcelNXInterface.ExcelNXInterface
instead?
"These people looked deep within my soul and assigned me a number based on the order in which I joined." - Homer
Okay, based on some other examples I found online I saw that some people used the progid in the manifest. I wasn't sure why, but I just followed the examples. So I went ahead and tried using your suggestion. This time around I got another error, but it seems much friendlier (maybe). It says "ActiveX component can't create Object". So maybe using
ExcelNXInterface.ExcelNXInterface
was the way to go, even though it still isn't working. It seems better than the error saying the Create Object Method Failed. Anyway, I am pretty much lost from here out. Not sure what else can be done. I have seen in other forums online that some people claim in order to pull this off you need to alter the Excel.exe.manifest file to point to your dll, and store the dll in the same folder as Excel's executable file. I'm hoping that isn't true. -
Okay, based on some other examples I found online I saw that some people used the progid in the manifest. I wasn't sure why, but I just followed the examples. So I went ahead and tried using your suggestion. This time around I got another error, but it seems much friendlier (maybe). It says "ActiveX component can't create Object". So maybe using
ExcelNXInterface.ExcelNXInterface
was the way to go, even though it still isn't working. It seems better than the error saying the Create Object Method Failed. Anyway, I am pretty much lost from here out. Not sure what else can be done. I have seen in other forums online that some people claim in order to pull this off you need to alter the Excel.exe.manifest file to point to your dll, and store the dll in the same folder as Excel's executable file. I'm hoping that isn't true.I suspect you'd need to update the progId in the manifest to
ExcelNXInterface.ExcelNXInterface
as well.
"These people looked deep within my soul and assigned me a number based on the order in which I joined." - Homer
-
I suspect you'd need to update the progId in the manifest to
ExcelNXInterface.ExcelNXInterface
as well.
"These people looked deep within my soul and assigned me a number based on the order in which I joined." - Homer
Okay so I changed the manifest to reflect the new progid:
ExcelInterface.ExcelInterface
. I assumed that also meant that I should change the progid in the DLL to match the manifest. I changed the following line:ProgId("ExcelNXInterface.ExcelNXInterface")> Public Class ExcelNXInterface
. As a result I am getting the following error: Method 'CreateObject' of object IActCtx failed. Thank you for your help by the way. -
Okay so I changed the manifest to reflect the new progid:
ExcelInterface.ExcelInterface
. I assumed that also meant that I should change the progid in the DLL to match the manifest. I changed the following line:ProgId("ExcelNXInterface.ExcelNXInterface")> Public Class ExcelNXInterface
. As a result I am getting the following error: Method 'CreateObject' of object IActCtx failed. Thank you for your help by the way.Member 12336929 wrote:
ExcelInterface.ExcelInterface
Member 12336929 wrote:
ProgId("ExcelNXInterface.ExcelNXInterface")
Which is it? These should both match.
"These people looked deep within my soul and assigned me a number based on the order in which I joined." - Homer
-
Hey Everyone, I have been searching the web for days to try and find a potential solution to my problem, and so far I have only gathered bits and pieces of a potential solution. I need to be able to make API calls to a CAD program from an Excel macro. The CAD program is called NX. It was developed by Siemens. They have an API called NXOpen that was written in VB.NET. I have tried referencing the appropriate DLL in Excel, however the DLL is not registered and nor can it be in my limited development environment. I do not have registry access. If I am able to pull this off I would like to distribute the workbook to my co-workers as well. So I have been exploring the possibility of using Registration Free COM in Excel 2010 (Windows 7 64 bit) to make the API calls I need from Excel. To try and do this I was going to use the following code to instantiate an object that points to the manifest for the NXOpen.dll file. I want to access a subroutine in the DLL called "Highlight". Also, from what I have read I will also need the dlls CLSID to reference in the manifest as well. That I don't know how to get. Any help would be very appreciated. Thank you.
Sub EXCELNX()
Dim actCtx As Object Set actCtx = CreateObject("Microsoft.Windows.ActCtx") actCtx.Manifest = ThisWorkbook.Path & "\\NXOpen.dll.manifest" Dim myNX As Object Set myNX = actCtx.CreateObject("Highlight")
End Sub