Delphi Xe.Как экспортировать функции перегрузки из DLL?
В модуле Windows.pas я вижу один из способов:
function InterlockedExchangeAdd(Addend: PLongint; Value: Longint): Longint stdcall; overload;
{$EXTERNALSYM InterlockedExchangeAdd}
function InterlockedExchangeAdd(var Addend: Longint; Value: Longint): Longint stdcall; overload;
{$EXTERNALSYM InterlockedExchangeAdd}
...
function InterlockedExchangeAdd(Addend: PLongint; Value: Longint): Longint; external kernel32 name 'InterlockedExchangeAdd';
function InterlockedExchangeAdd(var Addend: Longint; Value: Longint): Longint; external kernel32 name 'InterlockedExchangeAdd';
Средства, DLL может экспортировать функции с одинаковыми именами.
Я пытаюсь повторить:
Я создаю проект
Program TestMyDll;
{$APPTYPE CONSOLE}
uses SimpleShareMem, SysUtils;
Function MyFunc(const X:Integer):string; StdCall; External 'MyDll.dll' Name 'MyFunc'; Overload;
Function MyFunc(const X:Extended):string; StdCall; External 'MyDll.dll' Name 'MyFunc'; Overload;
begin
try
Writeln;
Writeln('MyDll test');
Writeln('Int: ' + MyFunc(10));
Writeln('Real: ' + MyFunc(10.55));
Readln;
except on E: Exception do Writeln(E.ClassName, ' : ', E.Message);end;
end.
Это компилируется нормально. Далее я создаю DLL:
Library MyDll;
uses
SimpleShareMem,
DllUnit1 in 'DllUnit1.pas';
{$R *.res}
begin
//test
MyFunc(10);MyFunc(10.55);
end.
... и модуль DllUnit1.pas
Unit DllUnit1; Interface
Function MyFunc(const X:Integer):string; Overload; StdCall;
Function MyFunc(const X: Extended):string; Overload; StdCall;
Exports
MyFunc; // COMPILE ERROR
Implementation
Uses SysUtils;
Function MyFunc(const X:Integer):string;
begin
result:=Inttostr(x);
end;
Function MyFunc(const X: Extended):string;
begin
result:=Floattostr(x);
end;
end.
Но при компиляции я получаю сообщение об ошибке: [DCC Error] DllUnit1.pas (7): E2273 Нет перегруженного версия «MyFunc» с этим списком параметров существует.
В Delphi Help, я вижу:
"Delphi Language Reference"/"The exports clause"
...
When you export an overloaded function or procedure from a dynamically loadable library, you must specify its parameter list in the exports clause. For example,
exports
Divide(X, Y: Integer) name 'Divide_Ints',
Divide(X, Y: Real) name 'Divide_Reals';
On Windows, do not include index specifiers in entries for overloaded routines.
Вопросы:
Как правильно экспортировать эти функции в модуле DllUnit1 и можно ли это сделать вообще в Delphi (экспорт под одним именем), чтобы получить тот же самый вызов из моего проекта TestMyDll, что и в начале (пример из windows.pas)?
Если такие функции могут быть экспортированы под одним именем, будет ли то, что будет корректно работать по вызову DLL с других языков (VB, C++)? Или лучше сделать две функции с разными именами?
P.S. Несколько похожих вопросов можно найти здесь (http://stackoverflow.com/questions/6257013/how-to-combine-overload-and-stdcall-in-delphi), но ответ мне не подошел
P.S.S. Плохой английский
ADD (Был добавлен после ответов)
Понятно, спасибо.
Сделал так:
В проекте:
Function MyFunc (const X:Integer):string; StdCall; External 'MyDll.dll' Name 'MyFunc'; Overload;
Function MyFunc (const X:Extended):string; StdCall; External 'MyDll.dll' Name ' MyFunc1'; Overload;
В DllUnit1
Exports
MyFunc (const X:Integer) Name 'MyFunc',
MyFunc (const X:Extended) Name 'MyFunc1';
Он собран и работает нормально.
Еще вопросы:
Как работает, но правильно ли это?
Имеет ли значение, как писать «Функция MyFunc (const X: Integer): string; Overload; StdCall;" или «Функция MyFunc (const X: Integer): string; StdCall; Overload;"?
Эта функция в проекте других языков (Vb, C++, C#) будет правильно вызвана?
Ответьте, пожалуйста, на дополнительные вопросы –
То, что вы показали сейчас, да, и другие языки смогут использовать эти функции как долго, так как они экспортируются с разными именами. –
Никакие другие языки не могут использовать эти функции после строки использования. –