Очень простая C ++ DLL, которую можно вызвать из .net - PullRequest
2 голосов
/ 02 сентября 2008

Я пытаюсь вызвать C DLL стороннего производителя с vb.net 2005 и получаю P/Invoke ошибки. Я успешно вызываю другие методы, но попал в узкое место на одном из более сложных. Вовлеченные структуры ужасны, и в попытке упростить устранение неполадок я хотел бы создать C ++ DLL, чтобы воспроизвести проблему.

Может ли кто-нибудь предоставить самый маленький фрагмент кода для C ++ DLL, который можно вызвать из .Net? Я получаю ошибку Unable to find entry point named XXX in DLL в моей C ++ DLL. Решение должно быть простым, но я не программист на C ++.

Я бы хотел использовать декларацию .net для DLL

.
Declare Function Multiply Lib "C:\MyDll\Debug\MyDLL.DLL" Alias "Multiply" (ByVal ParOne As Integer, ByVal byvalParTwo As Integer) As Integer

Ответы [ 3 ]

2 голосов
/ 02 сентября 2008

Попробуйте использовать __ decspec (dllexport) magic pixie dust в вашем объявлении функции C ++. Это объявление устанавливает несколько вещей, которые вам необходимы для успешного экспорта функции из DLL. Вам также может понадобиться использовать WINAPI или что-то подобное:

__declspec(dllexport) WINAPI int Multiply(int p1, int p2)
{
    return p1 * p2;
}

WINAPI устанавливает соглашение о вызове функции таким образом, чтобы оно подходило для вызова с языка, такого как VB.NET.

0 голосов
/ 04 сентября 2008

Используя предложение Грега, я нашел следующие работы. Как уже упоминалось, я не программист на C ++, но просто нужно что-то практичное.

myclass.cpp #include "stdafx.h"

BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
                 )
{
    return TRUE;
}

int _stdcall multiply(int x , int y)
{
    return x*y;
}

myclass.def БИБЛИОТЕКА myclass

EXPORTS

multiply @1

stdafx.cpp #include "stdafx.h"

stdafx.h

// stdafx.h : include file for standard system include files,
//  or project specific include files that are used frequently, but
//      are changed infrequently
//

#if !defined(AFX_STDAFX_H__5DB9057C_BAE6_48D8_8E38_464F6CB80026__INCLUDED_)
#define AFX_STDAFX_H__5DB9057C_BAE6_48D8_8E38_464F6CB80026__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000


// Insert your headers here
#define WIN32_LEAN_AND_MEAN     // Exclude rarely-used stuff from Windows headers

#include <windows.h>


//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_STDAFX_H__5DB9057C_BAE6_48D8_8E38_464F6CB80026__INCLUDED_)
0 голосов
/ 02 сентября 2008

Вы можете попытаться просмотреть экспортированные функции (через DumpBin или Dependency Walker) и посмотреть, не искажены ли имена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...