2017-02-06 13 views
1

Я рабочий DLL написаны на C++ с использованием Visual Studio 2015. Он содержит множество функций вида:Экспортные имена функций из C++ Dll в Delphi

BECALIBRARY_API int Functions::GetVersion(char* ptrVersionString) 
{ 
    char * Version; 
    Version = "Test 123456"; 
    strcpy_s(ptrVersionString, strlen(Version) + 1, Version); 
    return strlen(Version); 
} 

Функция Delphi получить это:

unit uBecaLibrary; 

interface 

function getVersion(Str1: pAnsichar): integer; stdCall; 

implementation 

function getVersion; external 'BecaLibrary.dll' index 1; 
//function getVersion; external 'BecaLibrary.dll' name 'getVersion'; 

end. 

Это прекрасно работает, за исключением того, что я должен поддерживать код Delphi, используя номера индексов DLL.

Что мне нужно сделать как стороне C++, так и стороне Delphi Seattle Windows 10 для использования имен функций, а не индексов.

ответ

2

Вы можете использовать dumpbin утилиту для просмотра экспортированных имена, как

"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\dumpbin.exe" /EXPORTS BecaLibrary.dll

имен, вероятно, будет покалеченные, но это не должно быть проблемой.

Если вы можете изменить DLL, вы можете добавить следующие внутри тела функции экспорта unmangled Name

#pragma comment(linker, "/EXPORT:" __FUNCTION__ "=" __FUNCDNAME__) 
+0

Существует алгоритм для генерации искаженных имен. IIRC они содержат количество байтов параметров каким-то образом, но я долгое время рассматривал это. – dummzeuch

+0

Да - это работает. Исправленное имя для простого вызова getVersion становится; функция getVersion; external 'BecaLibrary.dll' name '? GetVersion @ Functions @ BecaLibrary @@ SAHPAD @ Z'; Я называю Dlls, которые были созданы с использованием Embarcadero C++, и они не искажены. Есть ли способ остановить Visual Studio от этого? –

+0

Вы также можете добавить следующее в тело функции, чтобы также экспортировать unmangled name #pragma comment (linker, "/ EXPORT:" __FUNCTION__ "=" __FUNCDNAME__) – EugeneK

0

Вы можете просто использовать имя функции на последнем, как этот

var 
function getVersion(Str1: pAnsichar): integer; stdCall; external 'BecaLibrary.dll' name 'GetVersion'; 

implementation 

Для DLL

Чтобы экспортировать неразделенное имя, вы можете связать его с помощью файла определения модуля (.def), который определяет неразделенное имя в разделе EXPORTS. Для получения дополнительной информации см. EXPORTS. Еще один способ экспортировать unecorated name - использовать директиву
#pragma comment(linker, "/export:alias=decorated_name")
в исходном коде.

Когда вы объявляете dllexport или dllimport, вы должны использовать расширенный синтаксис атрибута и ключевое слово __declspec.
Источник: https://msdn.microsoft.com/en-us/library/3y1sfaz2.aspx

+0

Это похоже не работает. Имена экспортируются, но искажаются. Имя для 'GetVersion' становится: '? GetVersion @ Functions @ BecaLibrary @@ SAHPAD @ Z'; –

+0

Если это не сработает, я думаю, вам нужно экспортировать/выставить функции по-разному https://msdn.microsoft.com/en-us/library/z4zxe9k8.aspx – Henrikki

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

  • Нет связанных вопросов^_^