2015-10-21 3 views
1

Я написал этот код в C++:Как мне вызвать win32 dll из powerbuilder11.5?

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; 
} 

и построить DLL win32. затем скопируйте его в каталог PB.

enter image description here

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

enter image description here

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

enter image description here

, когда я запускаю его:

enter image description here

Почему возникает ошибка? tnx

+0

Как вы создаете свою dll (Visual Studio, MinGW, ...)? Имя экспортируемой функции в dll может быть не таким, как вы указываете во внешнем украшении, из-за * украшения имени *. – Seki

+2

также * пожалуйста * размещайте фактический текст кода вместо изображений, он делает локальное тестирование вашего кода мольбой :( – Seki

+0

Вы можете использовать ходок зависимостей, чтобы увидеть фактическое имя функции в вашей Dll. Если она была искалечена, вы можете либо поместите измененное имя в свой код PB или измените свою Dll, чтобы не управлять этим именем. См. http://stackoverflow.com/questions/1467144/how-do-i-stop-name-mangling-of-my-dlls-exported -функция для более – Slapout

ответ

3

После некоторых тестов здесь я думаю, что ваша проблема может возникнуть в результате украшения имени вашей экспортируемой функции. I.E: вместо того, чтобы быть названным sumx в dll, он компилятор имеет имя [email protected].

Вы можете проверить это, вызвав 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 [email protected] = @ILT+5([email protected]) 
          ^====================== HERE is the point! 
    Summary 

     1000 .data 
     1000 .idata 
     2000 .rdata 
     1000 .reloc 
     1000 .rsrc 
     2000 .text 

BTW, то @8 в названии означает 8 байт (2 х sizeof(int)) параметров, которые приведены функции.

У вас есть 2 варианта, чтобы исправить, что:

  • использовать точное [email protected] имя в объявлении внешней функции в PB (можно использовать псевдоним, не изменяя код PB):

    function int sumx (int a, int b) library "keyadll.dll" alias for '[email protected]' 
    

    Я не считаю это решение очень элегантным.

  • вы можете заставить VC называть экспортированный, как вы хотите (а не наоборот!), Используя файл определения модуля (.def).

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

      LIBRARY "keyadll.dll" 
      EXPORTS 
          sumx 
      

    Rebuild библиотеки DLL, и это должно быть хорошо для PB.

+0

Большое вам спасибо. – VOLVO

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