Экспорт класса C++ от DLL

Проблема идентична максимальной подпоследовательности, которую я решил использовать с помощью динамического программирования. Следите за текущей и предыдущей (прибыль, день продажи и дата продажи) Если ток выше предыдущего, замените предыдущий на текущий.

    int prices[] = { 38, 37, 35, 31, 20, 24, 35, 21, 24, 21, 23, 20, 23, 25, 27 };

    int buyDate = 0, tempbuyDate = 0;
    int sellDate = 0, tempsellDate = 0; 

    int profit = 0, tempProfit =0;
    int i ,x = prices.length;
    int previousDayPrice = prices[0], currentDayprice=0;

    for(i=1 ; i<x; i++ ) {

        currentDayprice = prices[i];

        if(currentDayprice > previousDayPrice ) {  // price went up

            tempProfit = tempProfit + currentDayprice - previousDayPrice;
            tempsellDate = i;
        }
        else { // price went down 

            if(tempProfit>profit) { // check if the current Profit is higher than previous profit....

                profit = tempProfit;
                sellDate = tempsellDate;
                buyDate = tempbuyDate;
            } 
                                     // re-intialized buy&sell date, profit....
                tempsellDate = i;
                tempbuyDate = i;
                tempProfit =0;
        }
        previousDayPrice = currentDayprice;
    }

    // if the profit is highest till the last date....
    if(tempProfit>profit) {
        System.out.println("buydate " + tempbuyDate + " selldate " + tempsellDate + " profit " + tempProfit );
    }
    else {
        System.out.println("buydate " + buyDate + " selldate " + sellDate + " profit " + profit );
    }   
26
задан Charles Menguy 26 April 2012 в 01:59
поделиться

4 ответа

Что относительно позднего связывания? Как в загрузке его с LoadLibrary () и GetProcAddress ()? Я - используемая способность загрузить библиотеку во время выполнения, и было бы замечательно, если Вы могли бы сделать это здесь.

, Таким образом, существует два способа загрузить DLL. Первое должно сослаться на один или несколько символов от DLL (Ваше имя класса, например), предоставить соответствующий импорт.LIB и позволить компоновщику понять все.

второе должно явно загрузить DLL через LoadLibrary.

Любой подход хорошо работает для экспорта функции C-уровня. Можно или позволить компоновщику обработать его или назвать GetProcAddress, как Вы отметили.

, Но когда дело доходит до экспортируемого классы , обычно только первый подход используется, т.е. неявно свяжитесь с DLL. В этом случае DLL загружается во время начала приложения, и приложению не удается загрузиться, если DLL не может быть найден.

, Если Вы хотите связаться с классом, определенным в DLL, и Вы хотите, чтобы тот DLL был загружен динамично, когда-то после инициирования программы, у Вас есть две опции:

  1. Создают объекты класса с помощью специальной функции фабрики, которая внутренне должна будет использовать (крошечный бит) ассемблер для "поднимания трубку" недавно созданных объектов к их соответствующим смещениям. Это должно быть сделано во времени выполнения ПОСЛЕ ТОГО, КАК DLL был загружен, очевидно. Хорошее объяснение этого подхода может быть найдено здесь .

  2. Использование загрузка задержки DLL .

, Учитывая все обстоятельства... вероятно, лучше, чтобы просто пойти с неявным соединением, в этом случае Вы определенно хотите использовать метод препроцессора, показанный выше. На самом деле, если Вы создадите новый DLL в Visual Studio и выберете опцию "export symbols" они, то макросы будут созданы для Вас.

Удача...

17
ответ дан 28 November 2019 в 06:35
поделиться

Когда Вы создаете DLL и модуль, который будет использовать DLL, иметь некоторый #define, который можно использовать для различения одного и другой, тогда можно сделать что-то вроде этого в заголовочном файле класса:

#if defined( BUILD_DLL )
    #define IMPORT_EXPORT __declspec(dllexport)
#else
    #define IMPORT_EXPORT __declspec(dllimport)
#endif
class IMPORT_EXPORT MyClass {
    ...
};

Редактирование: crashmstr бьют меня к нему!

17
ответ дан Graeme Perrow 28 November 2019 в 06:35
поделиться

Я использую некоторые макросы для маркировки кода для импорта, или экспорт

#ifdef ISDLL
#define DLL __declspec(dllexport)
#endif

#ifdef USEDLL
#define DLL __declspec(dllimport)
#endif

Тогда объявляют класс в заголовочном файле:

class DLL MyClassToExport { ... }

Тогда #define ISDLL в libary, и USEDLL прежде включая заголовочный файл в месте Вы хотите использовать класс.

я не знаю, если Вы, возможно, должны были сделать что-нибудь по-другому для работы с LoadLibrary

12
ответ дан crashmstr 28 November 2019 в 06:35
поделиться

Если Вы готовы поместить vtable в класс, Вы экспортируете, можно экспортировать функцию, которая возвращает интерфейс, и реализуйте класс в .dll, то помещенный это в .def файл. Вам, возможно, придется сделать некоторый обман объявления, но это не должно быть слишком твердо.

Точно так же, как COM.:)

0
ответ дан Tim Cooper 28 November 2019 в 06:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: