Обявен Hello World DLL файл. Външната функция не е намерена по време на изпълнение

Първоначално публикувано тук (https://stackoverflow.com/questions/32617735/declared-dll-but-errors-external-function-not-found), но беше информиран да не използва клас или пространство от имена. Повторно публикуване на по-прост пример, че все още не мога да се захвана за работа.

DLL, създаден с C++ (Visual Studio):

// myFirstDLL.h
#define DECLDIR __declspec(dllexport)

DECLDIR int GIMMEFIVE();



// myFirstDLL.cpp
#include "stdafx.h"
#include "myFirstDLL.h"
#include <stdexcept>

//using namespace std;

int GIMMEFIVE()
{
    return 5;
}

LotusScript агент:

Option Public
Option Declare

Declare Public Function GIMMEFIVE Lib "P:\Internet\dplows\visualstudio\myFirstDLL\myFirstDLL\Debug\myFirstDLL.dll" () As Integer

Sub Initialize
    MsgBox GIMMEFIVE()

End Sub

person dplows    schedule 17.09.2015    source източник
comment
Каква конвенция за извикване се очаква от скрипта lotus?   -  person Niall    schedule 17.09.2015
comment
@Niall, много прилича на VB. Само за информация, успешно съм извиквал функции от DLL преди (мигащ текущия прозорец в лентата на задачите чрез user32.dll). Сигурно нещо не е наред с моята.   -  person dplows    schedule 17.09.2015
comment
Това може да помогне. Може също да искате да използвате Dependency Walker, за да видите името на експортираната функция. Не знам този скрипт, но VBA може да е притеснителен относно имената на функциите (msdn.microsoft.com/en-us/library/aa235591(v=vs.60).aspx)   -  person Niall    schedule 17.09.2015
comment
Тази публикация в блога съдържа повече подробности за конвенциите за повикване и т.н. (triplewhitefox.com /tech-calling-c-api-from-lotusscript)   -  person Niall    schedule 17.09.2015
comment
Решен. Просто трябва да се увие във външен блок. Благодаря.   -  person dplows    schedule 17.09.2015
comment
Може би не променяйте въпроса, а го напишете като отговор на този въпрос. Сигурен съм, че няма да сте последният човек, който има този проблем.   -  person Niall    schedule 17.09.2015


Отговори (2)


Функцията трябва да бъде обвита в extern "C" блок;

extern "C"
{
    extern __declspec(dllexport) int GIMMEFIVE();
}
person Community    schedule 17.09.2015

Декларирайте го като extern "C" и __declspec(dllexport). Ако не извиквате функцията сами от вашата DLL, не е необходимо да я декларирате напред. Можете да направите всичко инлайн:

extern "C" __declspec(dllexport) int GIMMEFIVE()
{
    return 5;
}
person Daniel Stevens    schedule 17.09.2015