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.

Become a Premium Member and unlock a new, free course in leading technologies each month.

Solved

Posted on 2003-11-05

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.

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.

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

2 Comments

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);

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);

Question has a verified solution.

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

Earn Certification

HTML5 Specialist - Certification

Free withPremium

Course of the Month9 days, 23 hours left to enroll

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