VC++ Simple DLL Example
I am working on adding Automatic Trendlines to eSignal charts and need to be able to call a VC++ Regular DLL from an EFS script. I am new to VC++ and to DLLs and need help with a very simple call to an example DLL.
I found a great web page at http://msdn.microsoft.com/en-us/library/ms235636(v=VS.90).aspx that stepped me through making the VC++ DLL. Thanks to this page, I had no problem making the VC++ DLL using Visual Studio 2008.
I then created a very simple EFS to call the DLL. The EFS returns an error telling me that the called function was not found in the DLL.
I have included the error and all of test code below in hope that someone will see why the error is returned. For the test I am using a 32 bit computer and have tried to name the DLL both MathFuncsDll.dll and MathFuncsDllx32.dll. I tried using the Externs “C” command but got VC++ syntax errors. I don’t know how to add it to the sample code.
If anyone can help I would really appreciate it. I have tried to make this a very thorough post so that it can also help others with a complete example.
The simple EFS:
var dll = new DLL("MathFuncsDll.dll");
var InitialPass = true;
function preMain() {
dll.addFunction("Subtract", DLL.DOUBLE, DLL.CDECL, "Subtract", DLL.DOUBLE, DLL.DOUBLE);
}
function main() {
if ( isLastBarOnChart() == true ) {
if (InitialPass = true) {
var doub = "";
doub = dll.call("Subtract", 5.5, 1.25);
InitialPass = false;
}
}
return
}
The EFS error returned:
C:/Users/Andy/Documents/Interactive Data/Formulas/My Formulas/PTest.efs, line 13: Error: Function 'call': Failed to call dynamic library function: cannot find function 'Subtract' in library 'C:\Users\Andy\Documents\Interactive Data\Formulas\My Formulas\MathFuncsDll.dll'. Please specify correct dynamic library function name
The DLL code in VC++:
// MathFuncsDll.cpp
// compile with: /EHsc /LD
#include "MathFuncsDll.h"
#include <stdexcept>
using namespace std;
namespace MathFuncs
{
double MyMathFuncs::Add(double a, double b)
{
return a + b;
}
double MyMathFuncs::Subtract(double a, double b)
{
return a - b;
}
double MyMathFuncs::Multiply(double a, double b)
{
return a * b;
}
double MyMathFuncs:ivide(double a, double b)
{
if (b == 0)
{
throw new invalid_argument("b cannot be zero!");
}
return a / b;
}
}
// MathFuncsDll.h
namespace MathFuncs
{
class MyMathFuncs
{
public:
// Returns a + b
static __declspec(dllexport) double Add(double a, double b);
// Returns a - b
static __declspec(dllexport) double Subtract(double a, double b);
// Returns a * b
static __declspec(dllexport) double Multiply(double a, double b);
// Returns a / b
// Throws DivideByZeroException if b is 0
static __declspec(dllexport) double Divide(double a, double b);
};
}
MathFuncsDll.def file:
LIBRARY MathFuncsDll
DESCRIPTION "MathFuncsDesc"
EXPORTS
Add @1
Subtract @2
Multiply @3
Divide @4
I am working on adding Automatic Trendlines to eSignal charts and need to be able to call a VC++ Regular DLL from an EFS script. I am new to VC++ and to DLLs and need help with a very simple call to an example DLL.
I found a great web page at http://msdn.microsoft.com/en-us/library/ms235636(v=VS.90).aspx that stepped me through making the VC++ DLL. Thanks to this page, I had no problem making the VC++ DLL using Visual Studio 2008.
I then created a very simple EFS to call the DLL. The EFS returns an error telling me that the called function was not found in the DLL.
I have included the error and all of test code below in hope that someone will see why the error is returned. For the test I am using a 32 bit computer and have tried to name the DLL both MathFuncsDll.dll and MathFuncsDllx32.dll. I tried using the Externs “C” command but got VC++ syntax errors. I don’t know how to add it to the sample code.
If anyone can help I would really appreciate it. I have tried to make this a very thorough post so that it can also help others with a complete example.
The simple EFS:
var dll = new DLL("MathFuncsDll.dll");
var InitialPass = true;
function preMain() {
dll.addFunction("Subtract", DLL.DOUBLE, DLL.CDECL, "Subtract", DLL.DOUBLE, DLL.DOUBLE);
}
function main() {
if ( isLastBarOnChart() == true ) {
if (InitialPass = true) {
var doub = "";
doub = dll.call("Subtract", 5.5, 1.25);
InitialPass = false;
}
}
return
}
The EFS error returned:
C:/Users/Andy/Documents/Interactive Data/Formulas/My Formulas/PTest.efs, line 13: Error: Function 'call': Failed to call dynamic library function: cannot find function 'Subtract' in library 'C:\Users\Andy\Documents\Interactive Data\Formulas\My Formulas\MathFuncsDll.dll'. Please specify correct dynamic library function name
The DLL code in VC++:
// MathFuncsDll.cpp
// compile with: /EHsc /LD
#include "MathFuncsDll.h"
#include <stdexcept>
using namespace std;
namespace MathFuncs
{
double MyMathFuncs::Add(double a, double b)
{
return a + b;
}
double MyMathFuncs::Subtract(double a, double b)
{
return a - b;
}
double MyMathFuncs::Multiply(double a, double b)
{
return a * b;
}
double MyMathFuncs:ivide(double a, double b)
{
if (b == 0)
{
throw new invalid_argument("b cannot be zero!");
}
return a / b;
}
}
// MathFuncsDll.h
namespace MathFuncs
{
class MyMathFuncs
{
public:
// Returns a + b
static __declspec(dllexport) double Add(double a, double b);
// Returns a - b
static __declspec(dllexport) double Subtract(double a, double b);
// Returns a * b
static __declspec(dllexport) double Multiply(double a, double b);
// Returns a / b
// Throws DivideByZeroException if b is 0
static __declspec(dllexport) double Divide(double a, double b);
};
}
MathFuncsDll.def file:
LIBRARY MathFuncsDll
DESCRIPTION "MathFuncsDesc"
EXPORTS
Add @1
Subtract @2
Multiply @3
Divide @4
Comment