Как мне вызвать win32 dll из powerbuilder11.5?

Я написал этот код на 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.

введите описание изображения здесь

Я определяю это внешнюю функцию.

введите описание изображения здесь

И я называю это:

введите описание изображения здесь

когда я запускаю это:

введите описание изображения здесь

Почему происходит ошибка?
Тпх

3

Решение

После некоторых тестов я думаю, что ваша проблема может быть связана с оформлением имени вашей экспортируемой функции. И.Е .: вместо того, чтобы быть названным 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).

    1. в VS выберите добавление нового элемента в файл определения проекта / модуля
    2. просто поместите имена функций для экспорта. Будет содержать

      LIBRARY "keyadll.dll"EXPORTS
      sumx
      

    Перестройте свою DLL и все должно быть в порядке для PB.

5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]