Solved

Writing a C wrapper for VC++

Posted on 2003-11-05
2
455 Views
Last Modified: 2010-05-18
I have a package called OpenNurbs (www.opennurbs.org) 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 VC++.net? 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.
0
Comment
Question by:cdunn03
2 Comments
 
LVL 86

Assisted Solution

by:jkr
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 {

public:

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

// C-interface
typedef DWORD HOBJECT;
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);
0
 
LVL 48

Accepted Solution

by:
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
{
public:
    int Sum();
    int Subtract();
    int SetFirstArgument(int n){m_n1 = n}
    int SetSecondArgument(int n){m_n1 = n}

protected:
    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;
    m.SetFirstArgument(1);
    m.SetSecondArgument(2);
    return m.Sum();
}

int Subtract(int x1, int x2)
{
    CMath m;
    m.SetFirstArgument(1);
    m.SetSecondArgument(2);
    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;
    pMath->SetFirstArgument(n);
}

void SetSecondArgument(void* pObject, int n)
{
    CMath* pMath = (CMath*)pObject;
    pMath->SetSecondArgument(n);
}

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);
DeleteObject(p);






0

Featured Post

Master Your Team's Linux and Cloud Stack!

The average business loses $13.5M per year to ineffective training (per 1,000 employees). Keep ahead of the competition and combine in-person quality with online cost and flexibility by training with Linux Academy.

Question has a verified solution.

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

Suggested Solutions

Unlike C#, C++ doesn't have native support for sealing classes (so they cannot be sub-classed). At the cost of a virtual base class pointer it is possible to implement a pseudo sealing mechanism The trick is to virtually inherit from a base class…
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 goal of the tutorial is to teach the user how to use functions in C++. The video will cover how to define functions, how to call functions and how to create functions prototypes. Microsoft Visual C++ 2010 Express will be used as a text editor an…
The viewer will learn how to use the return statement in functions in C++. The video will also teach the user how to pass data to a function and have the function return data back for further processing.

831 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