Я написал этот код на C ++:
extern "C" __declspec(dllexport) int __stdcall sumx(int a, int b)
{
int result;
result = a + b;
return result;
}
Я также попробовал:
int __stdcall sumx(int a, int b)
{
int result;
result = a + b;
return result;
}
и собрать win32 dll. затем скопируйте его в каталог PB.
Я определяю это внешнюю функцию.
И я называю это:
когда я запускаю это:
Почему происходит ошибка?
Тпх
После некоторых тестов я думаю, что ваша проблема может быть связана с оформлением имени вашей экспортируемой функции. И.Е .: вместо того, чтобы быть названным sumx
в длл он называется _sumx@8
компилятором.
Вы можете проверить это, вызвав dumpbin /exports keyadll.dll
, С моей тестовой DLL это показывает:
C:\dev\powerbuilder\dlltest>dumpbin.exe /exports keyadll.dll
Microsoft (R) COFF/PE Dumper Version 8.00.50727.762
Copyright (C) Microsoft Corporation. All rights reserved.Dump of file keyadll.dll
File Type: DLL
Section contains the following exports for keyadll.dll
00000000 characteristics
5627876B time date stamp Wed Oct 21 14:39:07 2015
0.00 version
1 ordinal base
1 number of functions
1 number of names
ordinal hint RVA name
1 0 0000100A _sumx@8 = @ILT+5(_sumx@8)
^====================== HERE is the point!
Summary
1000 .data
1000 .idata
2000 .rdata
1000 .reloc
1000 .rsrc
2000 .text
Кстати, @8
в названии стоит 8 байтов (2 х sizeof(int)
) параметров, которые передаются функции.
У вас есть 2 варианта, чтобы это исправить:
использовать точное _sumx@8
имя в объявлении внешней функции в PB (вы можете использовать псевдоним, чтобы не изменять свой код PB):
function int sumx (int a, int b) library "keyadll.dll" alias for '_sumx@8'
Я не считаю это решение очень элегантным.
Вы можете заставить VC присвоить названию экспортируемый файл так, как ВЫ хотите (а не наоборот!), используя файл определения модуля (.def).
просто поместите имена функций для экспорта. Будет содержать
LIBRARY "keyadll.dll"EXPORTS
sumx
Перестройте свою DLL и все должно быть в порядке для PB.
Других решений пока нет …