Страница: 1 | 2 | 
		
		 
			   
			 
			 пишу я тут dll на С++, которую потом нада использовать в VB получилось сделать так, что VB видит функции, а вот так чтоб они работали - хрен :( вопрос в том что я не так делаю?? вот что есть: DLL'овский h-файл: extern "C" { 	RELIB_API void About(HWND hWnd); 	RELIB_API LPSTR RuDate(LPSTR EnDate); } DLL'овский CPP-файл: #include "ReLib.h" BOOL APIENTRY DllMain( HANDLE hModule,                         DWORD  ul_reason_for_call,                         LPVOID lpReserved 					 ) {     switch (ul_reason_for_call) 	{ 		case DLL_PROCESS_ATTACH: 		case DLL_THREAD_ATTACH: 		case DLL_THREAD_DETACH: 		case DLL_PROCESS_DETACH: 			break;     }     return TRUE; } RELIB_API void About(HWND hWnd) { 	MessageBox(hWnd,"Copyright (c)1995-2004 by Rebel™ http://rebel.bos.ru","About ReLib",MB_OK|MB_ICONINFORMATION); } RELIB_API LPSTR RuDate(LPSTR EnDate) { 	if(strlen(EnDate) < 10) return ""; 	LPSTR ret = new char[10]; 	ret[0] = EnDate[3]; 	ret[1] = EnDate[4]; 	return ret; } билдится без проблем. VB'шная форма: Private Declare Sub About Lib "ReLib.dll" (ByVal hwnd As Long) Private Declare Function rudate Lib "ReLib.dll" Alias "RuDate" (ByVal EnDate As String) As String Private Sub Form_Load()     About Me.hwnd     MsgBox rudate(Date$) End Sub при запуске выводит мессадж бокс но потом пишет: кугт-time error 49:Bad DLL calling conversion при запуске второй функции - пишет тоже самое тока стразу вопрос адресован в принципе к тем кто ето уже делал.. заранее спасибо всем откликнувшимся :) 
			 
			 чуть не забыл в h-файле еще прописано: #define RELIB_API __declspec(dllexport) DLL-ки лучше писать на Power Basic. По нему даже форум есть. Где-то надо прописать stdcall. Вот похожий вопрос их сишной рассылки: Вопрос отправлен: 21.01.2004, 21:04 Ответ отправлен: 22.01.2004, 09:56   По собственному опыту: личше писать DLL на ASM. Это самый простой язык. На PB вообще просто. Function ИмяФункции Alias "Имя в Таблице экспорта" (Параметры) EXPORT As Тип End Function В h-файле пишешь:   #define RELIB_API extern "C" __declspec(dllexport) RELIB_API void WINAPI About (HWND hWnd);   Где WINAPI определен в windef.h как #define WINAPI __stdcall ,  т.е. можно написать extern "C" __declspec(dllexport) void __stdcall About (HWND hWnd);  как собственно и написал USA.    В cpp-файле пишешь:   #include   void {          ... } НИФИГА!!!  если писать с __stdcall aka WINAPI aka APIENTRY, то вб выдает ошибку: Cant find DLL entry point for About  в общем ето не пашет  на всяк случай пишу DLL на Visual C++ 6.0, можт у него есть какие-то характерные особенности??? Ну Cant find DLL entry point это лучше чем Bad DLL calling conversion, мне так кацца.   Теперь надо покопаться в свойствах проекта и поставить: Conficuration Type - Dynamic Library (.dll) Use of MFC - Use Standard Windows Libraries Use of ATL - Not Using ATL   Ну и Relase наверно надо делать.   Может еще чего то.., если не заработает попробую уточнить, была помница такая проблема. Прости стормозил, если ты в VC6 пишешь, то при создании проекта выбираешь Win32  все так, билд релиза не помог.... все рано не  может найти точку входа  to Rebel: Ты пишешь dll на Си, а не на Си++  to USA: "Где-то надо прописать stdcall" - не надо, т.к. WINAPI и есть переопределенный __stdcall, т.е. typedef WINAPI __stdcall; Можешь писать WINAPI, а можешь __stdcall - это одно и то же. to CyRax: конечно лудше их писать на PowerBasic, си\си++ вообще [sensored], и винды глючат только из-за того, что все dll и api, содержащиеся в dll, были написаны на Си... Были бы на написаны на PowerBasic'е ничего бы не глючило...  Вообщем так, теперь по делу... Я написал dll, протестил ее в Си - все работает, все функции из dll выполняютя. Попрбовал в vb неявную загрузу: Private Declare Sub About Lib "E:\Работы\C_C++\_DLL\ForVbNetRu\VB_test\ForVbNetRu.dll" (ByVal hwnd As Long) 'Private Declare Function rudate Lib "E:\Работы\C_C++\_DLL\ForVbNetRu\VB_test\ForVbNetRu.dll" Alias "RuDate" (ByVal EnDate As String) As String Вот код DllMain из dll: BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved)  { 	switch (fdwReason) 	{ 		case DLL_PROCESS_ATTACH: 			MessageBox(NULL,"Enter to the Dll","Relib",MB_OK); 			break; 		case DLL_PROCESS_DETACH: 			MessageBox(NULL,"Enter of Dll","Relib",MB_OK); 			break; 	} return TRUE; } И смотрю что писходит... При запуске приложения на VB выскакивает сообщение "Enter to the Dll", потом тутже  "Enter of Dll", а уже потом возникает ошибка "Не могу найти точку входа"... ИМХО тут происходит следющее: Наш процесс присоединяется к dll, потом отсоединяется от нее и уже только после этого пытается загрузить функцию из dll... вот и возникает ошибка... Как это исправить пока не знаю, если что-то получится - напишу... Возможено все будет работать, если использовать LoadLibrary/FreeLibrary... Надеюсь, кому-то написанное интересно... ===================================================================== С уважением  Chill. Вот дока, я ее не читал... http://www.statsoft.ru/home/portal/applications/svb_adviser/externaldlls.htm  Чегото с этим Win32  Вот попробуй подругому: Создаешь проект - MFC AppWizard(dll) What type of DLL ... - Regular DLL with MFC statically linked      Ну етот Wizard создаст кучу всяких файлов, эти файлы трогать не надо  Создаешь один h-файл и один cpp-файл, с одинаковым именем  В h-файле  пишешь  В cpp-файле пишешь { MessageBox(hWnd,"Copyright (c)1995-2004 by Rebel™ http://rebel.bos.ru","About ReLib",MB_OK|MB_ICONINFORMATION); { if  LPSTR ret =  ret[0] = EnDate[3]; ret[1] = EnDate[4]; Теперь находишь def-файл, находишь строчку EXPORTS и делаешь так: EXPORTS ; Explicit exports can go here About @1 RuDate @2 Теперь компилируеш всю эту ботву, и типа все готово. Declare Sub About Lib "Имя.dll" (ByVal abc As Long)  Declare Function RuDate Lib "Имя.dll" (ByVal abc As String) As String Как вы думаете, народ... здесь у вас память не течет? LPSTR ret = new char[10]; Отвечу - течет... после вызова new , при завершении работы с выделенным участком памяти в си++ надо делать delete(освобождения участка памяти после его использования)... А-то у вас происходит утечка памяти, в C# это прокатит, т.к. "сборщик мусора" все подчистит, а в си++ увы... Почему бы просто не сделать char ret[10];? to Rebel: прошу прощения, ты всетаки используешь си++, т.к. оператора new в си нету  Еще я не уверен, что dll, написанную с использованием MFC можно юзать из других языков программирования... to Artificial Intelligence: MFC чего ты хочешь  Вообщем у меня получилось сделать dll с нуля и поюзать ее в vb, сейчас делаю dll как у Relib'а, как сделаю - выложу и объясню в чем фишка  
			
 
  
		
     
  
    
Вопрос: Пишем и пользуем DLL на CPP
     
    
Добавлено: 03.02.04 23:02
     
      
  
				
			  
					 
			
				 
    
		
       
    
Автор вопроса:  
     Rebel | Web-сайт: rebel.bos.ru
 Rebel | Web-сайт: rebel.bos.ru
      
       
  
 
    
				
		
		
					 
			
				 
  
		
     
  
    
Ответы
     
    
Всего ответов: 24
     
      
  
		
	  
			 
	
		 
    
       
    
Номер ответа: 1 
      
Автор ответа: Rebel
 Rebel






Вопросов: 32
Ответов: 50
      
 Web-сайт:  
 Профиль |  | #1
      
Добавлено:  04.02.04 00:06
       
    
       
  
 
    
		
	  
			 
	
		 
    
       
    
Номер ответа: 2 
      
Автор ответа: CyRax
 CyRax 




Разработчик Offline Client
ICQ: 204447456 
Вопросов: 180
Ответов: 4229
      
 Web-сайт:  
 Профиль |  | #2
      
Добавлено:  04.02.04 02:19
       
    
       
  
 
    
		
	  
			 
	
		 
    
       
    
Номер ответа: 3 
      
Автор ответа: USA
 USA


Вопросов: 1
Ответов: 184
      
 Профиль |  | #3
       
Добавлено:  04.02.04 03:42
       
    
       
  
 
     Вопрос № 1406 
Как сделать чтоб экспорное имя функции совпадало с настоящим (Visual C++)
Объявляю
extern "C" __declspec(dllexport) void __stdcall Destroy_MainDll(void)
Получаю в модуле Dll
_Destroy_MainDll@0
А как получить
Destroy_MainDll
Функция должна вызываться не только в C++
Отправитель: Алексей (aleksey_@pisem.net)
[Следующий вопрос >>] [Список вопросов] 
Отвечает vitya
Добрый день, Алексей!
Напиши def файл.
Отправитель: vitya 
		
	  
			 
	
		 
    
       
    
Номер ответа: 4 
      
Автор ответа: CyRax
 CyRax 




Разработчик Offline Client
ICQ: 204447456 
Вопросов: 180
Ответов: 4229
      
 Web-сайт:  
 Профиль |  | #4
      
Добавлено:  04.02.04 05:39
       
    
       
  
 
    
		
	  
			 
	
		 
    
       
    
Номер ответа: 5 
      
Автор ответа: Artificial Intelligence
 Artificial Intelligence

ICQ: 275368971 
Вопросов: 8
Ответов: 131
      
 Профиль |  | #5
       
Добавлено:  04.02.04 10:30
       
    
       
  
 
    
		
	  
			 
	
		 
    
       
    
Номер ответа: 6 
      
Автор ответа: Rebel
 Rebel






Вопросов: 32
Ответов: 50
      
 Web-сайт:  
 Профиль |  | #6
      
Добавлено:  04.02.04 19:08
       
    
       
  
 
     (((((((((((
((((((((((( т.е. я так понял что функция становится не экспортной
 т.е. я так понял что функция становится не экспортной 
 нада че-то еще придумывать...
 нада че-то еще придумывать...
		
	  
			 
	
		 
    
       
    
Номер ответа: 7 
      
Автор ответа: Artificial Intelligence
 Artificial Intelligence

ICQ: 275368971 
Вопросов: 8
Ответов: 131
      
 Профиль |  | #7
       
Добавлено:  04.02.04 19:37
       
    
       
  
 
    
		
	  
			 
	
		 
    
       
    
Номер ответа: 8 
      
Автор ответа: Artificial Intelligence
 Artificial Intelligence

ICQ: 275368971 
Вопросов: 8
Ответов: 131
      
 Профиль |  | #8
       
Добавлено:  04.02.04 20:17
       
    
       
  
 
     ynamic-Link Library
ynamic-Link Library
		
	  
			 
	
		 
    
       
    
Номер ответа: 9 
      
Автор ответа: Rebel
 Rebel






Вопросов: 32
Ответов: 50
      
 Web-сайт:  
 Профиль |  | #9
      
Добавлено:  04.02.04 20:25
       
    
       
  
 
    
		
	  
			 
	
		 
    
       
    
Номер ответа: 10 
      
Автор ответа: Chill
 Chill




ICQ: 554200 
Вопросов: 101
Ответов: 343
      
 Профиль |  | #10
       
Добавлено:  05.02.04 00:20
       
    
       
  
 
    
		
	  
			 
	
		 
    
       
    
Номер ответа: 11 
      
Автор ответа: Chill
 Chill




ICQ: 554200 
Вопросов: 101
Ответов: 343
      
 Профиль |  | #11
       
Добавлено:  05.02.04 02:09
       
    
       
  
 
    
		
	  
			 
	
		 
    
       
    
Номер ответа: 12 
      
Автор ответа: Artificial Intelligence
 Artificial Intelligence

ICQ: 275368971 
Вопросов: 8
Ответов: 131
      
 Профиль |  | #12
       
Добавлено:  05.02.04 12:01
       
    
       
  
 
     ynamic-Link Library геморой какойто получается.
ynamic-Link Library геморой какойто получается.
		
	  
			 
	
		 
    
       
    
Номер ответа: 13 
      
Автор ответа: Chill
 Chill




ICQ: 554200 
Вопросов: 101
Ответов: 343
      
 Профиль |  | #13
       
Добавлено:  05.02.04 12:55
       
    
       
  
 
     А остальной код у тя СИшный...
 А остальной код у тя СИшный...
		
	  
			 
	
		 
    
       
    
Номер ответа: 14 
      
Автор ответа: Artificial Intelligence
 Artificial Intelligence

ICQ: 275368971 
Вопросов: 8
Ответов: 131
      
 Профиль |  | #14
       
Добавлено:  05.02.04 13:15
       
    
       
  
2 Chill На счет работоспособности DLL'ки написаной по способу выше(Номер ответа: 12), могу зказать: я её из VB тока что юзал, все работало, правда размер её большой чего то получается, даже если убрать отладочную инормацию.
 
    
		
	  
			 
	
		 
    
       
    
Номер ответа: 15 
      
Автор ответа: Chill
 Chill




ICQ: 554200 
Вопросов: 101
Ответов: 343
      
 Профиль |  | #15
       
Добавлено:  05.02.04 13:41
       
    
       
  
 
     Размер будет большим.
 Размер будет большим.