Страница: 1 | 2 |
Вообщем сделал я все... все воркает и без 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 } //########## '###код 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=== Здорово! Работает, Гига-респект!!! Чутка изменил функцию 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??? как сделано там??? Вот отсюда 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 Если что-нибудь выясню по этому поводу - напишу, самому интересна данная тема по первой ссылке вычитал: "Заметим, что можно не писать оператор 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-файл чтоб компилятор его воспринимал??? кой-какя инфа к размышлению по написанию def файла есть по ссылке: http://programming.com.ua/doc/2/12.shtml#t06 О БЛИН!!! ПОЛУЧИЛОСЬ: добавил в 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 и все работает!!!! to Rebel спасибо, за то что выложил про def файл У меня не было времени посмотреть )) Есть предложение. Давай еще исследуем применение сторонних dll в vb и наберем статью про это... Т.е. предлогаю сделать статью, в которой будет описываться как создать простейшую dll на Си (ИМХО Си++ не надо использовать, т.к. это осложнит понимание), как написать к ней def файл ну и основную часть - как все это можнео юзать в vb... Описать механизмы ЯВНОЙ и НЕЯВНОЙ ЗАГРУЗКИ dll... Тока статья должна быть ориентрована в первую очередь на vb кодера... Всетаки для vbnet.ru будем писать ))) Как тебе предложение? одобряю обеими руками, и приятно и главное полезно! Вообщем пиши мне на мыло chill_hr@mail.ru или стучи в асю дом - 554200 работа - 305152991 Распределим кто что будет делать и начнем писать )))
Вопрос: Пишем и пользуем DLL на CPP
Добавлено: 03.02.04 23:02
Автор вопроса: Rebel | Web-сайт:
Ответы
Всего ответов: 24
Номер ответа: 16
Автор ответа:
Chill
ICQ: 554200
Вопросов: 101
Ответов: 343
Профиль | | #16
Добавлено: 05.02.04 14:43
Номер ответа: 17
Автор ответа:
Rebel
Вопросов: 32
Ответов: 50
Web-сайт:
Профиль | | #17
Добавлено: 06.02.04 21:40
Номер ответа: 18
Автор ответа:
Chill
ICQ: 554200
Вопросов: 101
Ответов: 343
Профиль | | #18
Добавлено: 06.02.04 22:57
Номер ответа: 19
Автор ответа:
Rebel
Вопросов: 32
Ответов: 50
Web-сайт:
Профиль | | #19
Добавлено: 07.02.04 00:58
Номер ответа: 20
Автор ответа:
Rebel
Вопросов: 32
Ответов: 50
Web-сайт:
Профиль | | #20
Добавлено: 07.02.04 01:19
Номер ответа: 21
Автор ответа:
Rebel
Вопросов: 32
Ответов: 50
Web-сайт:
Профиль | | #21
Добавлено: 07.02.04 01:25
Номер ответа: 22
Автор ответа:
Chill
ICQ: 554200
Вопросов: 101
Ответов: 343
Профиль | | #22
Добавлено: 08.02.04 00:03
Номер ответа: 23
Автор ответа:
Rebel
Вопросов: 32
Ответов: 50
Web-сайт:
Профиль | | #23
Добавлено: 09.02.04 15:25
Номер ответа: 24
Автор ответа:
Chill
ICQ: 554200
Вопросов: 101
Ответов: 343
Профиль | | #24
Добавлено: 09.02.04 17:26