Writing a C wrapper for VC++

Posted on 2003-11-05
Last Modified: 2010-05-18
I have a package called OpenNurbs ( that is written in VC++ and compiled as a DLL. I need to use the functions in this package in Matlab. Matlab can call a standard Windows DLL, but the DLL must have a C interface, since Matlab is written in C.

Is there an efficient way to to create this interface using either VC++ 6 or I have the standard version of both compilers.

I have some programming background, but am a physicist by trade, so I apologize if this task is easier than I think it is!

Thank you for your help.
Question by:cdunn03
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
LVL 86

Assisted Solution

jkr earned 200 total points
ID: 9688081
Unfortunately, it is not possible to just 'view' the code of that package, so here's a more general approach:

class CWhatever {


   int SampleMethod ( int i) { return 2 * i;}

// C-interface
HOBJECT CreateObject ( <params>) { return ( HOBJECT) new CWhatever(<params>);}

int SampleMethod ( HOBJECT hObj, int i) { return (( CWhatever*) hObj)->SampleMethod ( i);}

HOBJECT hObj = CreateObject ( ...);

int n = SampleMethod ( hObj, 2);
LVL 48

Accepted Solution

AlexFM earned 300 total points
ID: 9688201
You need to write Dll which exposes global functions. Internally it uses OpenNurbs classes. Suppose you have the following C++ class:

class CMath
    int Sum();
    int Subtract();
    int SetFirstArgument(int n){m_n1 = n}
    int SetSecondArgument(int n){m_n1 = n}

    int m_n1;
    int m_n2;
Let's make two operations using C-style exported functions.
First approach.

int Sum(int x1, int x2)
    CMath m;
    return m.Sum();

int Subtract(int x1, int x2)
    CMath m;
    return m.Subtract();

Client code:
int n = Sum(1, 2);
int m = Subtract(1, 2);

Second approach is better. It allows to C client to create class, use it and delete when necessary:

void* CreateObject()
    CMath* pMath = new CMath();
    return (void*)pMath;

void DeleteObject(void* p)
    delete (CMath*)p;

void SetFirstArgument(void* pObject, int n)
    CMath* pMath = (CMath*)pObject;

void SetSecondArgument(void* pObject, int n)
    CMath* pMath = (CMath*)pObject;

void Sum(void* pObject)
    CMath* pMath = (CMath*)pObject;
    return pMath->Sum();

void Subtract(void* pObject)
    CMath* pMath = (CMath*)pObject;
    return pMath->Subtract();

Client code:

void* p = CreateObject();
SetFirstArgument(p, 1);
SetSecondArgument(p, 2);
int n = Sum(p);
int m = Subtract(p);


Featured Post

On Demand Webinar: Networking for the Cloud Era

Did you know SD-WANs can improve network connectivity? Check out this webinar to learn how an SD-WAN simplified, one-click tool can help you migrate and manage data in the cloud.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

This article will show you some of the more useful Standard Template Library (STL) algorithms through the use of working examples.  You will learn about how these algorithms fit into the STL architecture, how they work with STL containers, and why t…
Go is an acronym of golang, is a programming language developed Google in 2007. Go is a new language that is mostly in the C family, with significant input from Pascal/Modula/Oberon family. Hence Go arisen as low-level language with fast compilation…
The viewer will learn additional member functions of the vector class. Specifically, the capacity and swap member functions will be introduced.
The viewer will be introduced to the technique of using vectors in C++. The video will cover how to define a vector, store values in the vector and retrieve data from the values stored in the vector.

623 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question