If you get this error, "ActiveX component can't create object", when you move your spreadsheet to a 64-bit environment and you're calling a Syspro Business Object, here is a solution.
Background: It is quite easy to create an Excel spreadsheet, put a button on the spreadsheet, and write a macro in VBA (Visual Basic for Applications) to pass the data into Syspro using one of Syspro's Business Objects, and so perform some business function such as creating a sales order or closing a manufacturing job; this can easily be done by using COM to access Syspro's Encore.transaction object which lives in Encore.DLL. On Windows XP and Vista and 32-bit versions of Windows 7, all runs well; you might use VBScript code like this:
However, on 64-bit versions of Microsoft Office on 64-bit versions of Windows 7 or Windows 8 or Windows Server 2008, you will get an error such as this:
This is because you can no longer call Encore.DLL because 64-bit processes can't run 32-bit DLL's. So how do you solve it? Here's a couple of ways you can solve it.
See this post for more details.
Create your object: here's C# code:
Compile your object, Syspro.Base.SoapClient.DLL.
Copy Syspro.Base.SoapClient.DLL into your Syspro\Base\ManagedAssemblies folder; the ideal way to do this is to upload it using Syspro’s tool available from the main menu: Home / Customization / Customization Tools / Upload Files to the Server….
Now in your VBscript, you can call the web service using code such as this:
Background: It is quite easy to create an Excel spreadsheet, put a button on the spreadsheet, and write a macro in VBA (Visual Basic for Applications) to pass the data into Syspro using one of Syspro's Business Objects, and so perform some business function such as creating a sales order or closing a manufacturing job; this can easily be done by using COM to access Syspro's Encore.transaction object which lives in Encore.DLL. On Windows XP and Vista and 32-bit versions of Windows 7, all runs well; you might use VBScript code like this:
Dim transaction As Object
Set transaction = CreateObject("Encore.transaction") Dim XmlParameters as string Dim XmlIn as string Dim EncoreLanguageCode as string
Dim EncoreLogLevel as string
Dim EncoreInstance as string
EncoreLogLevel = "ldNoDebug" EncoreInstance = "EncoreInstance_0" XmlParameters = "<your xml>" XmlIn = "<your xml in>" Dim GUID as string GUID = transaction.Logon("Operator", "OperatorPassword", "CompanyId", _ "CompanyPassword", EncoreLanguageCode, EncoreLogLevel, EncoreInstance, "") Dim XmlOut as string XmlOut = transaction.Post(GUID, "SORTOI", XmlParameters, XmlIn) |
However, on 64-bit versions of Microsoft Office on 64-bit versions of Windows 7 or Windows 8 or Windows Server 2008, you will get an error such as this:
ActiveX component can't create object
|
This is because you can no longer call Encore.DLL because 64-bit processes can't run 32-bit DLL's. So how do you solve it? Here's a couple of ways you can solve it.
Use a 32-bit version of Microsoft Office
You can install the 32-bit version of Microsoft Office on your 64-bit computer; this works OK, but isn't the preferred solution, but it could be the simplest solution.Web services via SOAP - stuck again
You could try to call Syspro web services using Microsoft's SOAP Toolkit 3.0, BUT again, the SOAP Tookit is no longer supported by Microsoft, and there isn't a 64-bit version of it, so again, you're stuck.See this post for more details.
Web services via a WCF proxy
In Visual Studio 2010, you can create a 64-bit DLL which you can reference the same way you'd reference Encore.DLL, but this DLL is just a proxy to call the Syspro Web Services using SOAP. To do that, create a new project in Visual Studio 2010; the output should be a Class Library, and mark the Assembly as COM-Visible (go to the project's properties / Application / Assembly Information).
Then add Service References: add the four Syspro web services (Query, Setup, Transaction and Utilities).Create your object: here's C# code:
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.ServiceModel;
using Syspro.Base.SoapClient.SysproQueryServiceReference;
using Syspro.Base.SoapClient.SysproSetupServiceReference;
using Syspro.Base.SoapClient.SysproUtilitiesServiceReference;
using Syspro.Base.SoapClient.SysproTransactionServiceReference;
namespace Syspro.Base.SoapClient
{
[Guid("2672CDBD-F7C9-41E9-A86E-BD7034285E2E")]
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface ISoapClient
{
[DispId(1)] // TODO: Are these Dispatch ID's necessary? If not, remove them.
void SetBaseURL(string URL);
// Utility routines
[DispId(2)]
string Logon(string Operator, string OperatorPassword, string CompanyId, string CompanyPassword);
[DispId(3)]
string Logoff(string userId);
[DispId(4)]
string GetLogonProfile(string UserId);
[DispId(5)]
string Run(string UserId, string BusinessObject, string Parameter);
// Transaction routines
[DispId(6)]
string Post(string UserId, string BusinessObject, string XmlParameters, string XmlIn);
[DispId(7)]
string Build(string UserId, string BusinessObject, string XmlIn);
// Query routines
[DispId(8)]
string Query(string UserId, string BusinessObject, string XmlIn);
[DispId(9)]
string Browse(string UserId, string XmlIn);
[DispId(10)]
string Fetch(string UserId, string XmlIn);
[DispId(11)]
string NextKey(string UserId, string XmlIn);
[DispId(12)]
string PreviousKey(string UserId, string XmlIn);
// Setup routines
[DispId(13)]
string Add(string UserId, string BusinessObject, string XmlParameters, string XmlIn);
[DispId(14)]
string Delete(string UserId, string BusinessObject, string XmlParameters, string XmlIn);
[DispId(15)]
string Update(string UserId, string BusinessObject, string XmlParameters, string XmlIn);
}
// Reference: http://msdn.microsoft.com/en-us/library/bb608604.aspx
[Guid("7D825322-30C9-42A4-9A74-57154FC3169F")]
[ClassInterface(ClassInterfaceType.None)]
[ProgId("Syspro.Base.SoapClient")]
public class SoapClient : ISoapClient
{
private string BaseURL = String.Empty;
private const string utilitiesEndpointName = "/utilities.asmx";
private const string transactionEndpointName = "/transaction.asmx";
private const string queryEndpointName = "/query.asmx";
private const string setupEndpointName = "/setup.asmx";
public SoapClient()
{
// Must have a public default constructor so that COM clients can create the type.
// Reference: http://msdn.microsoft.com/en-us/library/7fcfby2t.aspx
}
public void SetBaseURL(string URL)
{
BaseURL = URL;
}
#region Utility Routines
public string Logon(string Operator, string OperatorPassword, string CompanyId, string CompanyPassword)
{
System.ServiceModel.Channels.Binding binding = new System.ServiceModel.BasicHttpBinding();
var endPoint = new EndpointAddress(BaseURL + utilitiesEndpointName);
var client = new utilitiesclassSoapClient(binding, endPoint);
var result = client.Logon(Operator, OperatorPassword, CompanyId,
CompanyPassword, Language.AUTO,
LogDetail.ldNoDebug, Instance.EncoreInstance_0, "");
return result;
}
public string Logoff(string userId)
{
System.ServiceModel.Channels.Binding binding = new System.ServiceModel.BasicHttpBinding();
var endPoint = new EndpointAddress(BaseURL + utilitiesEndpointName);
var client = new utilitiesclassSoapClient(binding, endPoint);
var result = client.Logoff(userId);
return result;
}
public string GetLogonProfile(string userId)
{
System.ServiceModel.Channels.Binding binding = new System.ServiceModel.BasicHttpBinding();
var endPoint = new EndpointAddress(BaseURL + utilitiesEndpointName);
var client = new utilitiesclassSoapClient(binding, endPoint);
var result = client.GetLogonProfile(userId);
return result;
}
public string Run(string UserId, string BusinessObject, string Parameter)
{
System.ServiceModel.Channels.Binding binding = new System.ServiceModel.BasicHttpBinding();
var endPoint = new EndpointAddress(BaseURL + utilitiesEndpointName);
var client = new utilitiesclassSoapClient(binding, endPoint);
var result = client.Run(UserId, BusinessObject, Parameter);
return result;
}
#endregion Utilities Routines
#region Transaction Routines
public string Post(string UserId, string BusinessObject, string XmlParameters, string XmlIn)
{
BasicHttpBinding binding = new System.ServiceModel.BasicHttpBinding();
binding.ReaderQuotas.MaxStringContentLength = 2147483647;
binding.MaxReceivedMessageSize = 2147483647;
var endPoint = new EndpointAddress(BaseURL + transactionEndpointName);
var client = new transactionclassSoapClient(binding, endPoint);
var result = client.Post(UserId, BusinessObject, XmlParameters, XmlIn);
return result;
}
public string Build(string UserId, string BusinessObject, string XmlIn)
{
BasicHttpBinding binding = new System.ServiceModel.BasicHttpBinding();
binding.ReaderQuotas.MaxStringContentLength = 2147483647;
binding.MaxReceivedMessageSize = 2147483647;
var endPoint = new EndpointAddress(BaseURL + transactionEndpointName);
var client = new transactionclassSoapClient(binding, endPoint);
var result = client.Build(UserId, BusinessObject, XmlIn);
return result;
}
#endregion Transaction Routines
#region Query Routines
public string Query(string UserId, string BusinessObject, string XmlIn)
{
BasicHttpBinding binding = new System.ServiceModel.BasicHttpBinding();
binding.ReaderQuotas.MaxStringContentLength = 2147483647;
binding.MaxReceivedMessageSize = 2147483647;
var endPoint = new EndpointAddress(BaseURL + queryEndpointName);
var client = new queryclassSoapClient(binding, endPoint);
var result = client.Query(UserId, BusinessObject, XmlIn);
return result;
}
public string Browse(string UserId, string XmlIn)
{
BasicHttpBinding binding = new System.ServiceModel.BasicHttpBinding();
binding.ReaderQuotas.MaxStringContentLength = 2147483647;
binding.MaxReceivedMessageSize = 2147483647;
var endPoint = new EndpointAddress(BaseURL + queryEndpointName);
var client = new queryclassSoapClient(binding, endPoint);
var result = client.Browse(UserId, XmlIn);
return result;
}
public string Fetch(string UserId, string XmlIn)
{
BasicHttpBinding binding = new System.ServiceModel.BasicHttpBinding();
binding.ReaderQuotas.MaxStringContentLength = 2147483647;
binding.MaxReceivedMessageSize = 2147483647;
var endPoint = new EndpointAddress(BaseURL + queryEndpointName);
var client = new queryclassSoapClient(binding, endPoint);
var result = client.Fetch(UserId, XmlIn);
return result;
}
public string NextKey(string UserId, string XmlIn)
{
BasicHttpBinding binding = new System.ServiceModel.BasicHttpBinding();
binding.ReaderQuotas.MaxStringContentLength = 2147483647;
binding.MaxReceivedMessageSize = 2147483647;
var endPoint = new EndpointAddress(BaseURL + queryEndpointName);
var client = new queryclassSoapClient(binding, endPoint);
var result = client.NextKey(UserId, XmlIn);
return result;
}
public string PreviousKey(string UserId, string XmlIn)
{
BasicHttpBinding binding = new System.ServiceModel.BasicHttpBinding();
binding.ReaderQuotas.MaxStringContentLength = 2147483647;
binding.MaxReceivedMessageSize = 2147483647;
var endPoint = new EndpointAddress(BaseURL + queryEndpointName);
var client = new queryclassSoapClient(binding, endPoint);
var result = client.PreviousKey(UserId, XmlIn);
return result;
}
#endregion Query Routines
#region Setup Routines
public string Add(string UserId, string BusinessObject, string XmlParameters, string XmlIn)
{
BasicHttpBinding binding = new System.ServiceModel.BasicHttpBinding();
binding.ReaderQuotas.MaxStringContentLength = 2147483647;
binding.MaxReceivedMessageSize = 2147483647;
var endPoint = new EndpointAddress(BaseURL + setupEndpointName);
var client = new setupclassSoapClient(binding, endPoint);
var result = client.Add(UserId, BusinessObject, XmlParameters, XmlIn);
return result;
}
public string Delete(string UserId, string BusinessObject, string XmlParameters, string XmlIn)
{
BasicHttpBinding binding = new System.ServiceModel.BasicHttpBinding();
binding.ReaderQuotas.MaxStringContentLength = 2147483647;
binding.MaxReceivedMessageSize = 2147483647;
var endPoint = new EndpointAddress(BaseURL + setupEndpointName);
var client = new setupclassSoapClient(binding, endPoint);
var result = client.Delete(UserId, BusinessObject, XmlParameters, XmlIn);
return result;
}
public string Update(string UserId, string BusinessObject, string XmlParameters, string XmlIn)
{
BasicHttpBinding binding = new System.ServiceModel.BasicHttpBinding();
binding.ReaderQuotas.MaxStringContentLength = 2147483647;
binding.MaxReceivedMessageSize = 2147483647;
var endPoint = new EndpointAddress(BaseURL + setupEndpointName);
var client = new setupclassSoapClient(binding, endPoint);
var result = client.Update(UserId, BusinessObject, XmlParameters, XmlIn);
return result;
}
#endregion Setup Routines
}
}
|
Compile your object, Syspro.Base.SoapClient.DLL.
Copy Syspro.Base.SoapClient.DLL into your Syspro\Base\ManagedAssemblies folder; the ideal way to do this is to upload it using Syspro’s tool available from the main menu: Home / Customization / Customization Tools / Upload Files to the Server….
Now you need to register the DLL. Run an elevated command prompt (go to Start / All Programs / Accessories, right-click on Command Prompt, click on Run as Administrator), and type in these commands:
cd
C:\Windows\Microsoft.NET\Framework64\v4.0.30319
regasm /codebase
"C:\Syspro61\Base\ManagedAssemblies\Syspro.Base.SoapClient.dll"
|
You should get this response:
Types registered
successfully
|
Dim soap as Object
Dim XmlOut as string Dim XmlParameters as string Dim XmlIn as string XmlParameters = "<your xml>" XmlIn = "<your xml in>" Set soap = CreateObject("Syspro.Base.SoapClient") soap.SetBaseURL "http://www.example.com/sysprowebservices/" Dim GUID as string GUID = soap.Logon("Operator", "OperatorPassword", "CompanyId", "CompanyPassword") XmlOut = soap.Post(GUID, "SORTOI", XmlParameters, XmlIn) |
No comments:
Post a Comment