Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 | 2 |

 

  Вопрос: Пишем и пользуем DLL на CPP Добавлено: 03.02.04 23:02  

Автор вопроса:  Rebel | Web-сайт: rebel.bos.ru

Ответить

  Ответы Всего ответов: 24  

Номер ответа: 16
Автор ответа:
 Chill



ICQ: 554200 

Вопросов: 101
Ответов: 343
 Профиль | | #16 Добавлено: 05.02.04 14:43

Вообщем сделал я все... все воркает и без MFC, размер dll 40 кб. Можно и меньше, наверно, если настроить проект...

Прочитав

http://www.statsoft.ru/home/portal/applications/svb_adviser/externaldlls.htm

до меня дошло как нада указывать Alias для собственных dll функций...

Описывать механизм не буду, т.к. любой может пойти по ссылке и посмотреть... =)

Так, теперь к нашим баранам...

Привожу рабочий код:

//###ReLib.h###

#include

#ifdef EXPORT_RELIB_API

#define RELIB_API __declspec(dllexport)

#else

#define RELIB_API __declspec(dllimport)

#endif

extern "C" RELIB_API void CALLBACK About(HWND hWnd);

extern "C" RELIB_API LPSTR CALLBACK RuDate(LPSTR EnDate);

//##########

//###ReLib.cpp###

#include "ReLib.h"

#define EXPORT_RELIB_API

//DllMain - вообще не нужна в данном случае,

//т.к. эта функция используется для инициализации и деинициализации

//различных переменных в dll и для выполнения каких-либо действий при

//присоединении/отсоединении нового потока или процесса.

extern "C" void CALLBACK About(HWND hWnd)

{

MessageBox(hWnd,"Copyright (c)1995-2004 by Rebel™ http://rebel.bos.ru","About ReLib",MB_OK|MB_ICONINFORMATION);

}

extern "C" LPSTR CALLBACK RuDate(LPSTR EnDate)

{

if(strlen(EnDate) < 10) return NULL;

char ret[10];

ret[0] = EnDate[3];

ret[1] = EnDate[4];

ret[2] = '\0';//нельзя оставлять "строки" открытыми, это приведет к неправильной работе программы или к сбою!!!

return static_cast(ret);

}

//##########

'###код VB###

Private Declare Sub About Lib "C:\Chill\Projects\C++\_DLL\ReLib\ReLibVB\ReLib.dll" Alias "_About@4" (ByVal hWnd As Long)

Private Declare Function RuDate Lib "C:\Chill\Projects\C++\_DLL\ReLib\ReLibVB\ReLib.dll" Alias "_RuDate@4" (ByRef Str As String) As Long

Private Sub cmdAbout_Click()

Call About(Me.hWnd)

End Sub

Private Sub cmdRuDate_Click()

MsgBox RuDate(Date$)

End Sub

'########

Теперь работа над ошибками =)

Вообщем Relib ты забыл указать что функция должна быть CALLBACK, без этого работать не будет.

extern "C" RELIB_API void CALLBACK About(HWND hWnd);

extern "C" RELIB_API LPSTR CALLBACK RuDate(LPSTR EnDate);

extern "C" - нужен для того, чтобы из других языков можно было видеть имена функций =)

В cpp файле, т.е. при реализации RELIB_API указывать не надо, надо указывать только в определении функции.

DllMain тебе вообще не нужен, т.к. у тебя ничего не инициализируется/вызывается при загрузке/выгрузке dll.

Посмотри функцию RuDate, по моему она не работает... ну я думаю ты сам дальше разберешься, только не забывыай закрывать строки '\0' и если используешь new освобождай потом память...

Удачи!!!

===Chill===

Ответить

Номер ответа: 17
Автор ответа:
 Rebel



Вопросов: 32
Ответов: 50
 Web-сайт: rebel.bos.ru
 Профиль | | #17
Добавлено: 06.02.04 21:40

Здорово! Работает, Гига-респект!!!

Чутка изменил функцию About:

extern "C" void CALLBACK About (HWND hWnd)

{

MessageBox(hWnd,"ReLib is a DLL with Rebel's common functions.\nCopyright (c)1995-2004 by Rebel™ http://rebel.bos.ru\nThanks to: Chill, Artificial Intelligence, ","About ReLib",MB_OK|MB_ICONINFORMATION);

}

но продолжу вопросничать: почему приходится писать Alias "_About@4", т.е. откуда берется "_" и "@4", можно ли как-то обойтись без них, например как при декларации ShellAbout??? как сделано там???

Ответить

Номер ответа: 18
Автор ответа:
 Chill



ICQ: 554200 

Вопросов: 101
Ответов: 343
 Профиль | | #18 Добавлено: 06.02.04 22:57

Вот отсюда http://www.statsoft.ru/home/portal/applications/svb_adviser/externaldlls.htm

*********************************************************************

Выражение Alias используется для задания точного имени, которое используется компилятором для этой функции. Стандартный вызов процедур __stdcall предписывает, что перед именем функции должен стоять символ подчеркивания функции ("_"), в конце имени должен стоять символ @, за которым следует цифра, равная числу размеру всех параметров в байтах.

*********************************************************************

>>можно ли как-то обойтись без них, например как при декларации ShellAbout??? как >>сделано там???

Не знаю... может и можно... Если найдешь ответ на этот вопрос - сообщи, мне тоже интересно =)

*********************************************************************

http://www.akzhan.midi.ru/devcorner/akdeltnt-content/akdeltnt-0043.html

По-ходу вабор такого АЛИАСА как-то связан с работой rundll или rundll32...

Как именно связан, не знаю, но если пойти по выше приведенной ссылке, то увидишь, что при запуске dll через эти проги (rundll), параметры выглядят также...

rundll32 test.dll,_Test@16 this is a command line

Если что-нибудь выясню по этому поводу - напишу, самому интересна данная тема =)

Ответить

Номер ответа: 19
Автор ответа:
 Rebel



Вопросов: 32
Ответов: 50
 Web-сайт: rebel.bos.ru
 Профиль | | #19
Добавлено: 07.02.04 00:58

по первой ссылке вычитал: "Заметим, что можно не писать оператор Alias, если в файле .DEF сделана запись, относящаяся к этой DLL-библиотеке. Если добавить запись относительно SampleFunction и SampleSubroutine, то компоновщик создаст "псевдоним" без символа подчеркивания и суффикса @XXX.".

Почитал mfc42ювуа и вычитал там:

LIBRARY MFC42

EXPORTS

DllGetClassObject @ 1 PRIVATE

DllCanUnloadNow @ 2 PRIVATE

DllRegisterServer @ 3 PRIVATE

DllUnregisterServer @ 4 PRIVATE

?AfxMessageBox@@YGHIII@Z @ 1199 NONAME

...

вот можт попробовать написать соответстующий *.def файл и описать все там, на примере AfxMessageBox, вот тока как его писать: что означает "?" в начале функции и "NONAME" в конце???? и куда пихать def-файл чтоб компилятор его воспринимал???

Ответить

Номер ответа: 20
Автор ответа:
 Rebel



Вопросов: 32
Ответов: 50
 Web-сайт: rebel.bos.ru
 Профиль | | #20
Добавлено: 07.02.04 01:19

кой-какя инфа к размышлению по написанию def файла есть по ссылке:

http://programming.com.ua/doc/2/12.shtml#t06

Ответить

Номер ответа: 21
Автор ответа:
 Rebel



Вопросов: 32
Ответов: 50
 Web-сайт: rebel.bos.ru
 Профиль | | #21
Добавлено: 07.02.04 01:25

О БЛИН!!! ПОЛУЧИЛОСЬ:

добавил в CPP проект ReLib.def файл седующего содержания:

LIBRARY "ReLib"

DESCRIPTION "ReLib is a DLL with Rebel's common functions"

EXPORTS

About

отбилдил и в VB проекте написал:

Private Declare Sub reAbout Lib "M:\Projects\Visual C++\ReLib\Debug\ReLib.dll" Alias "About" (ByVal hWnd As Long)

Private Sub Form_Load()

reAbout Me.hWnd

End Sub

и все работает!!!!

Ответить

Номер ответа: 22
Автор ответа:
 Chill



ICQ: 554200 

Вопросов: 101
Ответов: 343
 Профиль | | #22 Добавлено: 08.02.04 00:03

to Rebel  спасибо, за то что выложил про def файл =)

У меня не было времени посмотреть =)))

Есть предложение.

Давай еще исследуем применение сторонних dll в vb и наберем статью про это... Т.е. предлогаю сделать статью, в которой будет описываться как создать простейшую dll на Си (ИМХО Си++ не надо использовать, т.к. это осложнит понимание), как написать к ней def файл ну и основную часть - как все это можнео юзать в vb... Описать механизмы ЯВНОЙ и НЕЯВНОЙ ЗАГРУЗКИ dll...

Тока статья должна быть ориентрована в первую очередь на vb кодера... Всетаки для vbnet.ru будем писать =))))

Как тебе предложение?

Ответить

Номер ответа: 23
Автор ответа:
 Rebel



Вопросов: 32
Ответов: 50
 Web-сайт: rebel.bos.ru
 Профиль | | #23
Добавлено: 09.02.04 15:25

одобряю обеими руками, и приятно и главное полезно!

Ответить

Номер ответа: 24
Автор ответа:
 Chill



ICQ: 554200 

Вопросов: 101
Ответов: 343
 Профиль | | #24 Добавлено: 09.02.04 17:26

Вообщем пиши мне на мыло chill_hr@mail.ru

или стучи в асю

дом - 554200

работа - 305152991

Распределим кто что будет делать и начнем писать =))))

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам