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

Первоначально опубликовано здесь (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
Какое соглашение о вызовах ожидается в сценарии лотоса?   -  person Niall    schedule 17.09.2015
comment
@ Найл, это очень похоже на 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