Solved

Writing a C wrapper for VC++

Posted on 2003-11-05
2
453 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

How to improve team productivity

Quip adds documents, spreadsheets, and tasklists to your Slack experience
- Elevate ideas to Quip docs
- Share Quip docs in Slack
- Get notified of changes to your docs
- Available on iOS/Android/Desktop/Web
- Online/Offline

Join & Write a Comment

  Included as part of the C++ Standard Template Library (STL) is a collection of generic containers. Each of these containers serves a different purpose and has different pros and cons. It is often difficult to decide which container to use and …
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…
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.
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.

746 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

Need Help in Real-Time?

Connect with top rated Experts

12 Experts available now in Live!

Get 1:1 Help Now