Still celebrating National IT Professionals Day with 3 months of free Premium Membership. Use Code ITDAY17


Writing a C wrapper for VC++

Posted on 2003-11-05
Medium Priority
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 800 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 1200 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

Technology Partners: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Question has a verified solution.

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

In days of old, returning something by value from a function in C++ was necessarily avoided because it would, invariably, involve one or even two copies of the object being created and potentially costly calls to a copy-constructor and destructor. A…
Written by John Humphreys C++ Threading and the POSIX Library This article will cover the basic information that you need to know in order to make use of the POSIX threading library available for C and C++ on UNIX and most Linux systems.   [s…
The viewer will learn how to user default arguments when defining functions. This method of defining functions will be contrasted with the non-default-argument of defining functions.
The viewer will learn how to clear a vector as well as how to detect empty vectors in C++.

715 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