calling C++ from Python

On 06/10/2013 at 07:25, xxxxxxxx wrote:

We want to make cracking our python plugin a bit more difficult, by putting the hash creation in a C++ library.
Is there a simple but complete tutorial how to call C++ functions from python?

Pim

On 06/10/2013 at 07:53, xxxxxxxx wrote:

not sure if you can read german, but i think one of the best python tutorials come from
a german IT publishing company called galileo computing.

http://openbook.galileocomputing.de/python/python_kapitel_26_001.htm

On 06/10/2013 at 11:04, xxxxxxxx wrote:

A link to an english tutorial on how to use the ctypes module is here:
http://python.net/crew/theller/ctypes/tutorial.html

Remember that dynamic libraries can be replaced easily. It should be relatively
safe if you perform a proper check, eg. by comparing via an MD5 hash.

Best,
-Niklas

On 07/10/2013 at 23:59, xxxxxxxx wrote:

Thanks for the links littledevil and Niklas,

And indeed, checking the dynamic library using a MD5 hash is a good idea.
The more levels of protection, the better.

On 09/10/2013 at 00:57, xxxxxxxx wrote:

sorry, I'm running into errors.
"AttributeError: function 'Add' not found"

I guess my C++ is not correct.
I do believe the lib is oke:

1>------ Build started: Project: MathFuncsDll, Configuration: Debug x64 ------
1>     Creating library d:\users\pgrooff\documents\visual studio 2010\Projects\Dynamic library\x64\Debug\MathFuncsDll.lib and object d:\users\pgrooff\documents\visual studio 2010\Projects\Dynamic library\x64\Debug\MathFuncsDll.exp
1>  MathFuncsDll.vcxproj -> d:\users\pgrooff\documents\visual studio 2010\Projects\Dynamic library\x64\Debug\MathFuncsDll.dll
1>  MathFuncsDll.vcxproj -> d:\users\pgrooff\documents\visual studio 2010\Projects\Dynamic library\x64\Debug\MathFuncsDll.dll
========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========

Here the c++ h and cpp file and the python code

// MathFuncsDll.h
  
#ifdef MATHFUNCSDLL_EXPORTS
#define MATHFUNCSDLL_API __declspec(dllexport) 
#else
#define MATHFUNCSDLL_API __declspec(dllimport) 
#endif
  
namespace MathFuncs
{
    // This class is exported from the MathFuncsDll.dll
    class MyMathFuncs
    {
    public: 
        // Returns a + b
        static MATHFUNCSDLL_API double Add(double a, double b); 
  
        // Returns a - b
        static MATHFUNCSDLL_API int Subtract(int a, int b); 
  
        // Returns a * b
        static MATHFUNCSDLL_API double Multiply(double a, double b); 
  
        // Returns a / b
        // Throws const std::invalid_argument& if b is 0
        static MATHFUNCSDLL_API double Divide(double a, double b); 
    };
}
  
-----------------------
  
// MathFuncsDll.cpp : Defines the exported functions for the DLL application.
//
  
#include "stdafx.h"
  
  
// MathFuncsDll.cpp : Defines the exported functions for the DLL application. 
//
  
#include "stdafx.h"
#include "MathFuncsDll.h"
#include <stdexcept>
  
using namespace std;
  
namespace MathFuncs
{
    double MyMathFuncs::Add(double a, double b)
    {
        return a + b;
    }
  
    int MyMathFuncs::Subtract(int a, int b)
    {
        return a - b;
    }
  
    double MyMathFuncs::Multiply(double a, double b)
    {
        return a * b;
    }
  
    double MyMathFuncs::Divide(double a, double b)
    {
        if (b == 0)
        {
            throw invalid_argument("b cannot be zero!");
        }
  
        return a / b;
    }
}
  
-------------------
  
import c4d
import ctypes 
  
  
def main() :
    path = 'D:/Users/pgrooff/Documents/Visual Studio 2010/Projects/Dynamic library/x64/Debug/MathFuncsDll.dll'
  
    bibliothek = ctypes.CDLL(path) 
    #bib = ctypes.CDLL('msvcrt')
    #print bib.printf('2.33aaaa')
    #print bib.time(None)
    print bibliothek.Add(c_double(1.5),c_double(1.5))
  
    
if __name__=='__main__':
    main()

Note: Using another lib 'msvcrt' seem to work.

On 09/10/2013 at 06:13, xxxxxxxx wrote:

Ok, I made it much more simpler and it works now.

Just a simple C++ file, no h file.

#define DLLEXPORT extern "C" __declspec(dllexport)
  
  
DLLEXPORT int add()
{
	return 11;
}
  

And the python script code:

import c4d
import sys
import ctypes 
  
def main() :
  
    lib_path = 'D:/Users/pgrooff/Documents/Visual Studio 2010/Projects/SimpleDLL/x64/Release/simpleDLL.dll'
    mydll = ctypes.CDLL(lib_path) 
    print mydll.add()
  
  
    
if __name__=='__main__':
    main()