2015-10-05 4 views
0

У меня возникли проблемы с вызовом функции C++ из dll в проекте VB.net. Я попытался с простыми примерами, показанными нижеПочему я получаю сообщение «Не удалось найти точку входа с именем« SquareRoot »в DLL»?

Для C++ длл

#include <cmath> 
extern "C" __declspec(dllexport) double SquareRoot(double value) 
{ 
    return pow(value, 0.5); 
} 

Я строю DLL и скопировать его в папку VB.net

Для проекта VB.net

Module Module1 
    <Runtime.InteropServices.DllImport("DLL_Test.dll")> _ 
    Private Function SquareRoot(ByVal value As Double) As Double 

    End Function 

    Sub Main() 
     MsgBox(SquareRoot(2)) 
    End Sub 

End Module 

Я продолжаю получать Additional information: Unable to find an entry point named 'SquareRoot' in DLL 'DLL_Test.dll'. Когда я бегу dumpbin.exe на DLL_Test.dll я получаю следующее

File Type: DLL 

    Summary 

     1000 .data 
     1000 .idata 
     2000 .rdata 
     1000 .reloc 
     1000 .rsrc 
     4000 .text 
     10000 .textbss 

Я не уверен, что мне не хватает, какие-то идеи? Заранее спасибо.

+1

Вы использовали '/ exports', когда вы запускали' dumpbin'? –

+0

Кроме того, глобальная функция 'pow' поступает от' '. '' предоставляет 'std :: pow' вместо этого. –

+0

Похоже, что вы можете столкнуться с именем mangling на стороне C++. Вы можете использовать Dependency Walker (http://www.dependencywalker.com/) для просмотра фактического имени функции, которое экспортирует код C++. Кроме того, этот вопрос может помочь: http://stackoverflow.com/questions/1467144/how-do-i-stop-name-mangling-of-my-dlls-exported-function – Slapout

ответ

1

Наименование mangling. extern "C" не отключает его, он просто меняет правила.

У вас также есть несоответствие соглашения о вызовах.

Вы можете решить оба сразу через ключевое слово __stdcall на функции C++.

+0

Спасибо за ответ, но я изменил 'extern" C "__declspec (dllexport) double SquareRoot (двойное значение)' to 'double __stdcall SquareRoot (double value)', но я все равно получаю ту же ошибку –

+0

Я хотел объединить это с существующим кодом, а не отнять старый аннотаций. –

+0

Я не уверен, что следую, жаль, что это был долгий день :) –

Смежные вопросы