Calling C functions from Python – part 1 – using ctypes

Recently I’ve been evaluating Python interop technologies for a project at work and I think it’ll made an interesting blog series. Let’s say your have following C code (add extern “C” if you are in C++ land) and compile it into a dynamic library (dll/.so/.dylib): int Print(const char *msg) { printf(“%s”, msg); return 0; } int Add(int…

0

Avoiding C++ types in your P/invokes

It’s easier to explain this in an example. Let’s say you have a export function in your native DLL: void WINAPI MyFunction(_com_ptr_t<IMyInterface> ptr) { // … do something with ptr ptr->Func(); } And the DllImport would be something like this: [DllImport("mydll.dll")] void MyFunction(IMyInterface ptr); Everything seems to be perfectly valid, except that there is a…

0

WARNING: VS 2012 might break your broken P/Invoke

I’m seeing many people reporting that they are seeing strange P/invoke issues when they moved their code to VS 2012. Typically, they have P/invokes like this: [DllImport("Win32Project2.dll", PreserveSig = true, CharSet = CharSet.Unicode)] static extern int MyPInvoke(out string ret); If you attach a native debugger (or enable native debugging), with the right symbols (public symbol…

2

Marshal.GetHRForException does more than just Get-HR-For-Exception

Let’s first start by looking at a small code snippet: if (Marshal.GetHRForException(myException) == E_SOME_COM_ERROR) DoSomething(); This looks perfectly fine, right? Not really. It turns out this API is actually poorly named, and it actually does more than just retrieving the HR from the exception object. Using this API incorrectly could give you some weird problems,…

0