Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Builder App with MSVC dll 
V
    Опции темы
Kirgston
Дата 18.2.2011, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 792
Регистрация: 24.12.2007

Репутация: 2
Всего: 2



Всем доброго времени суток! Собственно ГУЙ написан на билдере, ядро надо писать на студии. Вот только никак адекватно не могу подключить дллку от студии к билдеру. Собственно вот примерно в длл:

Код

extern "C" __declspec(dllexport) char* EncA(char* text, char *key);


в билдере вызываю:

Код

typedef char* (*PEncA)(char* text, char* key);

              char key[] = "Key";
    HMODULE hLib = LoadLibrary(L"mydll.dll"); // Загружаем библиотеку
    if (hLib)
    {
        PEncA EncA = (PEncA)GetProcAddress(hLib, "EncA"); // Загружаем функцию
        if (EncA)
        {
            char *str = "Privet";
            char *enc = EncA(str,key);
        }
    }



В дллку передается всё норм. Возвращается один символ о_О . Хотя в дллке стоит тупо для теста return "Hello"; Если выставить __stdcall в дллке и в билдере то вообще не видит дллку... причем если пытаюсь вызвать именно нужный код то получаю "мега крэшы" которых , если собрать в студии в виде ехе, нету. Дллка юзает много АСМ вставок + должна быть строго на студии. Гуй строго на билдере

Добавлено через 3 минуты и 55 секунд
Так же мне необходимо передать строку не в виде char\wchar_t а в виде примерно std::(w)string , но это не "Си" подобные вызовы. Что делать в этом случае? Или выходить что передавать вектора и вообще что то STL нельзя?
PM MAIL   Вверх
borisbn
Дата 19.2.2011, 09:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 18
Всего: 135



Цитата(Kirgston @  18.2.2011,  15:55 Найти цитируемый пост)
extern "C" __declspec(dllexport) char* EncA(char* text, char *key);

укажи здесь явно тип вызова __cdecl
Код

extern "C" __declspec(dllexport) char* __cdecl EncA(char* text, char *key);

и в билдере тоже
Код

typedef char* (__cdecl *PEncA)(char* text, char* key);

у меня так работают > 50 dll-ек, созданные именно в студии и используемые именно в билдере.

Цитата(Kirgston @  18.2.2011,  15:55 Найти цитируемый пост)
Или выходить что передавать вектора и вообще что то STL нельзя?

категорически нет


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Kirgston
Дата 22.2.2011, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 792
Регистрация: 24.12.2007

Репутация: 2
Всего: 2



Цитата(borisbn @  19.2.2011,  09:42 Найти цитируемый пост)
укажи здесь явно тип вызова __cdecl

Спасибо, попробую. Но назревает вопрос... а почему тогда _stdcall не скушал? о_О 


Цитата(borisbn @  19.2.2011,  09:42 Найти цитируемый пост)
категорически нет

увы но очень прискорбно :( тогда выходит что прийдется писать нечто типа своего маленького STLа 
PM MAIL   Вверх
borisbn
Дата 22.2.2011, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 18
Всего: 135



Цитата(Kirgston @  22.2.2011,  18:10 Найти цитируемый пост)
а почему тогда _stdcall не скушал?

M$VC, не смотря на extern "C", экспортирует функции с постфиксом типа foo@4

Цитата(Kirgston @  22.2.2011,  18:10 Найти цитируемый пост)
тогда выходит что прийдется писать нечто типа своего маленького STLа

зачем ? достаточно в экспортируемых ф-циях использовать только POD-типы и указатели на них. вместо std::string char *, вместо std::vector<int> int * и т.д. а снаружи сразу "засовывать" их в классы stl.

только учти, что нельзя возвращать указатели типа string.c_str() или &vector[0] для stl-классов, созданных на стеке. типа того
Код

const char * getStr() {
    std::string s = "hello";
    return s.c_str(); // так нельзя
}

можно только для статически созданных или созданных как член класса
Код

class Class {
...
    std::string m_retString;
};

const char * Class::getStr() {
    m_retString = "hello";
    return m_retString.c_str(); // так можно
}

...
в билдере
Class * p;
...
std::string str = p->getStr();



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0453 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.