Использование в VB DLL написанной в VC

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
serj2008
Начинающий
Начинающий
 
Сообщения: 22
Зарегистрирован: 27.05.2008 (Вт) 9:14

Использование в VB DLL написанной в VC

Сообщение serj2008 » 01.06.2008 (Вс) 20:42

Как подключить написанную на VC билиотеку к своему проекту на VB? Через Project\references\brows не получается ругается что файл не такой. Библиотеку писал не сам, но листинг ее есть.

serj2008
Начинающий
Начинающий
 
Сообщения: 22
Зарегистрирован: 27.05.2008 (Вт) 9:14

Сообщение serj2008 » 01.06.2008 (Вс) 20:56

вроде нет. А как проверить?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 01.06.2008 (Вс) 21:50

AlexManiac
Полную чушь говоришь. Невероятную просто.

serj2008
Чтобы библиотека добавлялась через Project->References, она должна в ресурсах содержать TLB. При этом, она может быть нифига не объектной, как говорит AlexManiac, а быть самоый обычной библиотекой, экспортирующей самый обычные функции. Но в ресурсах у неё должна быть TLB, где все эти функции описаны. Т.е. не обязательно все - просто в VB окажутся доступными только те, что объявлены.

И не обязательно в ресурсах -- TLB может валяться рядом отдельным файлом.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

serj2008
Начинающий
Начинающий
 
Сообщения: 22
Зарегистрирован: 27.05.2008 (Вт) 9:14

Сообщение serj2008 » 01.06.2008 (Вс) 22:18

Код: Выделить всё
// SampleModule.cpp : Defines the entry point for the DLL application.
//

#include "../Module.h"

CModule module("Sample.EmptyModule", "Just empty Rumus2 module", 1, 0, 0, 3);

//âíåøíÿÿ ôóíêöèÿ ïîëó÷åíèÿ èíôîðìàöèè î ìîäóëå
extern "C" LRESULT __declspec(dllexport)GetModuleInfo(MODULE_INFO* lpsInfo)
{
   return module.GetModuleInfoWrap(lpsInfo);
}
//âíåøíÿÿ ôóíêöèÿ èíèöèàëèçàöèè è óñòàíîâêè óêàçàòåëÿ íà SendMessage
extern "C" void __declspec(dllexport)Initialize(SEND_MESSAGE_FUNC lpSendMessageFunc, SEND_MESSAGE_FUNC lpPostMessageFunc, FXHANDLE pCoreData, FXHANDLE pIdModule)
{
   module.InitializeWrap(lpSendMessageFunc, lpPostMessageFunc, pCoreData, pIdModule);
}

//âíåøíèé îáðàáîò÷èê ñîîáùåíèé
extern "C" LRESULT __declspec(dllexport)ReceiveMessage(FXHANDLE pObject, UINT nMessageID, WPARAM wParam, LPARAM lParam)
{
   return module.ReceiveMessageWrap(pObject,nMessageID,wParam,lParam);
}


вот часть кода этой библиотеки. ЕЕ я не сам писал поэтому разобратся там тяжело.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 01.06.2008 (Вс) 22:30

Код библиотеки здесь не имеет никакого значения.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 02.06.2008 (Пн) 0:53

Ну да, конено же я говорю чушь. только мне вот интересно, какой из вариантов ответов, мой или ваш, спрашивающему более понятен? с учетом его подвопроса


Более понятен? Понятными будут, вероятно, оба варианта.
Ты хотел сказать "более прост для понимания"? Более прост для понимания будет тот вариант, который более прост сам по себе. При этом, если вариант прост, но является полной чушью, он не имеет никакой ценности.

На вопрос, как складывать две обыкновенные дроби можно ответить двумя способами:
  • Можно сказать, что нужно найти наименьший общий знаменатель, привести обе дроби к этому наименьшему знаменателю, домножив оба числителя на соответствующие дополнительные множители, затем сложить эти два числителя, получив таким оразом результат.
  • Можно сказать, что для этого достаточно сложить числители и сложить знаменатели.


Очевидно, что вопрошающему второй ответ будет более понятен. Но при этом, второй ответ - это полная чушь. И какой толк с того, что он более понятен?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 02.06.2008 (Пн) 19:41

serj2008
А там точно STDCall функции?

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 02.06.2008 (Пн) 20:00

Ну вообщето в c не stdcall по умолчанию ;)
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

serj2008
Начинающий
Начинающий
 
Сообщения: 22
Зарегистрирован: 27.05.2008 (Вт) 9:14

Сообщение serj2008 » 02.06.2008 (Пн) 20:08

Так как подключать, какие варианты есть предлагайте. А то выясныть долго можно что да как. Нужно так попробовать не получится подругому. Вот щас с помощью LoadLibrary(...)
GetProcAddress(...) хочу попробовать. А DLL должна при этом обязательно в system32 лежать?

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 02.06.2008 (Пн) 20:25

Как подключить написанную на VC билиотеку к своему проекту на VB?


Без tlb'шки -- никак. В VB tlb'шка чем-то сродни *.lib'е в C++.
Если тебе известны прототипы функций, и они все __stdcall, то просто создай модуль и в нем объяви эти функции через Declare Function/Sub (еще можно поиграться с GetProcAddress, но VB не поддерживает вызов функций по указателю, так что без извращений тут не обойтись)... Если функции не __stdcall, все, баста :) Правда, при наличии исходников библиотеки это дело легко можно поправить...
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

serj2008
Начинающий
Начинающий
 
Сообщения: 22
Зарегистрирован: 27.05.2008 (Вт) 9:14

Сообщение serj2008 » 02.06.2008 (Пн) 20:55

Да исходники есть. Ктож их только разберет.

serj2008
Начинающий
Начинающий
 
Сообщения: 22
Зарегистрирован: 27.05.2008 (Вт) 9:14

Сообщение serj2008 » 02.06.2008 (Пн) 21:19

Ну вроде подключилось через
Код: Выделить всё
lb = LoadLibrary("SampleWidgetStep3.dll")
pa = GetProcAddress(lb, Initialize)
покрайней мере не ругается на эти строчки.
Как теперь функции вызывать из библиотеки?

И еще, когда просматриваю просмоторщиком эту библиотеку она пишет что использует: kernel32.dll, user32.dll, Msvcp80.dll, Msvcr.dll мне их тоже подключать надо, или так прокатит?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 02.06.2008 (Пн) 21:24

serj2008


Я тебе ответил, ты не читал этого?

Чтобы эту сишную библу подключить к VB через Project->References, у библы в ресурсах должна быть TLB.

Есть ещё варианты, но давай остановимся на этом. Что тебе в этом варианте непонятно?

Если при попытке подключить библу через Project-->References ты получаешь сообщение о об ошибке, то значит у этой библы нет TLB.

Значит твоя задача - прикрепить к этоу библе TLB.

Итак, что непонятно?


Кроме того, как верно заметили Mikle и andll правильно заметили, что функции не stdcall-ные.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 02.06.2008 (Пн) 21:26

Если функции не __stdcall, все, баста

Да я бы не сказал, что баста. Всего-то сделать некоторые доп. действия со стеком.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

serj2008
Начинающий
Начинающий
 
Сообщения: 22
Зарегистрирован: 27.05.2008 (Вт) 9:14

Сообщение serj2008 » 02.06.2008 (Пн) 22:28

Не понятно где взять этот TLB. И как его прикрепить.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 02.06.2008 (Пн) 22:33

serj2008
Взять его можно у разработчика. Но, вероятно, разработчик не делал TLB.

Сделать можно самому. Очень легко. В исходнике TLB объявляется библа library, внутри неё модуль, внутри него - объявляешь свои функции. По сути, объявить функцию -- разместить в модуле её прототип. Единственно, в чём сложность, так это в том, что у функций твоих у аргментов типы какие-то редкие библиотеко-специфичные.
В принципе, можешь свободно поменять их всех на int и скомпилировать TLB так. А можешь описать их же (я так понимаю, там структуры какие-то) в TLB, тогда их можно будет поюзать прямо из под VB.

Только ты учитывай, что библу надо бы перекомпилировать, дабы функции стади stdcall-ными. Иначе с VB ты с ними просто так поработать не сможешь, и TLB вряд ли чем-то поможет.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

serj2008
Начинающий
Начинающий
 
Сообщения: 22
Зарегистрирован: 27.05.2008 (Вт) 9:14

Сообщение serj2008 » 03.06.2008 (Вт) 20:10

Спасибо всем, как я понял будет легче свою DLL на VB. Тем более текст на С есть, я думал это легко библиотеку подключить и юзать. :oops: :oops:

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 03.06.2008 (Вт) 20:27

serj2008
Это действительно легко.

Я хочу (я действительно хочу), чтобы ты разобрался в этой теме. В своё время мне пришлось разбираться в этой теме, и у меня не было человека, который бы мне помог.

Сейчас, помочь тебе могу, например, я.

Если же ты всё-таки решил писать на VB свою библиотеку, то тебе этого не сделать без моего инструмента.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 79

    TopList