Страница: 1 | 2 | 
		
		 
			   
			 
			 
			 
			 
			
 
  
		
     
  
    
Вопрос: Вызов DLL
     
    
Добавлено: 23.12.05 16:29
     
      
  
				
			  
					 
			
				 
    
		
       
    
Автор вопроса:  
    
 Progos | Web-сайт: html-expert.org.ru | ICQ: 311715784 
      
       
  
Подскажите такой вот вопрос:
 
    
Создал на Сях библиотеку, в ней функция
extern "C" __declspec(dllexport) int Func()
{
return 10;
}
Ну и потом просто вызываю
Пишет
Функция выполняется, я проверял, но значения не возвращает. Если ставить On Error Resume Next - не ругается, но опять же, значение не возвращает
В чем проблема?
				
		
		
					 
			
				 
  
		
     
  
    
Ответы
     
    
Всего ответов: 18
     
      
  
		
	  
			 
	
		 
    
       
    
Номер ответа: 1 
      
Автор ответа:
 LamerOnLine
![]()
![]()
![]()
ICQ: 334781088 
Вопросов: 108
Ответов: 2822
      
 Профиль |  | #1
       
Добавлено:  23.12.05 17:05
       
    
       
  
Лучше объявлять тип явно, код более читабелен
 
    
Private Declare Function Func Lib "my DLL.dll" () as Long
кроме того, неужто так необходим пробел в имени файла? Это тебе не вордовский документ.
А по английски то че пишет?
		
	  
			 
	
		 
    
       
    
Номер ответа: 2 
      
Автор ответа:
 HOOLIGAN
![]()
Вопросов: 0
Ответов: 1066
      
 Профиль |  | #2
       
Добавлено:  23.12.05 17:06
       
    
       
  
"my DLL.dll" () As Long
 
    
		
	  
			 
	
		 
    
       
    
Номер ответа: 3 
      
Автор ответа:
 AgentFire
![]()
![]()
![]()
ICQ: 192496851 
Вопросов: 75
Ответов: 3178
      
 Профиль |  | #3
       
Добавлено:  23.12.05 18:41
       
    
       
  
 
    
 
)
		
	  
			 
	
		 
    
       
    
Номер ответа: 4 
      
Автор ответа:
 Progos
![]()
![]()
ICQ: 311715784 
Вопросов: 39
Ответов: 157
      
 Web-сайт:  
 Профиль |  | #4
      
Добавлено:  24.12.05 06:17
       
    
       
  
Дело ведь не в читабельности текста. А работать из-за "my DLL.dll" () As Long все равно не стало(и не должно было)
 
    
И без пробела в файле тоже ноль эффекта
		
	  
			 
	
		 
    
       
    
Номер ответа: 5 
      
Автор ответа:
 HOOLIGAN
![]()
Вопросов: 0
Ответов: 1066
      
 Профиль |  | #5
       
Добавлено:  24.12.05 08:54
       
    
       
  
Ну тогда продолжаем гадать? Или дашь больше информации?
 
    
P.S.
Давно си-функции стали по умолчанию stdcall?
		
	  
			 
	
		 
    
       
    
Номер ответа: 6 
      
Автор ответа:
 «UL.eXe»
![]()
![]()
![]()
![]()
![]()
![]()
ICQ: 197.895.916.247 
Вопросов: 72
Ответов: 540
      
 Профиль |  | #6
       
Добавлено:  24.12.05 17:18
       
    
       
  
 
    
а где dll'ка находится?
 - в App.Path
Попробуй в Win\System или System32 записать ее..
		
	  
			 
	
		 
    
       
    
Номер ответа: 7 
      
Автор ответа:
 HOOLIGAN
![]()
Вопросов: 0
Ответов: 1066
      
 Профиль |  | #7
       
Добавлено:  24.12.05 17:57
       
    
       
  
Никакой разницы нет, в папке с программой или в системной лежит dll.
 
    
		
	  
			 
	
		 
    
       
    
Номер ответа: 8 
      
Автор ответа:
 Progos
![]()
![]()
ICQ: 311715784 
Вопросов: 39
Ответов: 157
      
 Web-сайт:  
 Профиль |  | #8
      
Добавлено:  25.12.05 08:07
       
    
       
  
 
    
Я вроде, все, что используется дал...
		
	  
			 
	
		 
    
       
    
Номер ответа: 9 
      
Автор ответа:
 HOOLIGAN
![]()
Вопросов: 0
Ответов: 1066
      
 Профиль |  | #9
       
Добавлено:  25.12.05 10:03
       
    
       
  
Dll давай
 
    
		
	  
			 
	
		 
    
       
    
Номер ответа: 10 
      
Автор ответа:
 «UL.eXe»
![]()
![]()
![]()
![]()
![]()
![]()
ICQ: 197.895.916.247 
Вопросов: 72
Ответов: 540
      
 Профиль |  | #10
       
Добавлено:  25.12.05 13:10
       
    
       
  
 
    
		
	  
			 
	
		 
    
       
    
Номер ответа: 11 
      
Автор ответа:
 Progos
![]()
![]()
ICQ: 311715784 
Вопросов: 39
Ответов: 157
      
 Web-сайт:  
 Профиль |  | #11
      
Добавлено:  25.12.05 15:51
       
    
       
  
 
    
#include "Main.h"
#include "head.h"
#include "string.h"
#include "RichEdit.h"
#include <stdio.h>
#define Public extern "C" __declspec(dllexport)
void ParseHTML(String Text,int SelStart,HWND Rich,int SLine=-1,int ELine = -1);
HMODULE lRich;
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
	return DefWindowProc(hwnd,msg,wParam,lParam);
}
BOOL InitApp(HINSTANCE hInstance)
{
 ATOM aWndClass;
 WNDCLASS wc;
 memset(&wc, 0, sizeof(wc));
 wc.style = 0;
 wc.lpfnWndProc = (WNDPROC) WndProc;
 wc.cbClsExtra = 0;
 wc.cbWndExtra = 0;
 wc.hInstance = hInstance;
 wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
 wc.hCursor = LoadCursor(NULL, IDC_ARROW);
 wc.hbrBackground = (HBRUSH)(COLOR_WINDOW +1);
 wc.lpszMenuName = (LPSTR)NULL;
 wc.lpszClassName = (LPSTR)"RichEditor";
 aWndClass = RegisterClass(&wc);
 return (aWndClass != 0);
}
const Green = 0xB000;
const Yellow = 0x7777;
const Gray = 0x777777;
const PHP = 0x808000;
HWND NRich,Form;
struct P2P
{
	int StartP;
	int EndP;
};
int IsPHP;bool IsJS;
String* PHPTagInd, *CQ; //', ELINET&
String Rich_Callback_string;
bool RtfSend=false;
bool Running=true;
BOOL APIENTRY DllMain( HANDLE hModule,DWORD  ul_reason_for_call,LPVOID lpReserved)
{
	switch (ul_reason_for_call)
	{
		case DLL_PROCESS_ATTACH:
			MSG msg;
			if(!InitApp((HINSTANCE)hModule)) return FALSE;
			lRich=LoadLibrary("RichEd20.dll"
;
			Form = CreateWindow("RichEditor","a",0,CW_USEDEFAULT,CW_USEDEFAULT,
				CW_USEDEFAULT,CW_USEDEFAULT,0,0,HINSTANCE(hModule),NULL); 
			NRich = CreateWindowEx(NULL,"RichEdit20a",NULL,WS_VISIBLE|ES_SUNKEN|WS_CHILDWINDOW|ES_MULTILINE|WS_VSCROLL|ES_AUTOVSCROLL|ES_NOHIDESEL|WS_HSCROLL|ES_AUTOHSCROLL|ES_WANTRETURN,10,10,200,200,Form,(HMENU)25,(HINSTANCE)hModule,NULL);
			UpdateWindow(Form);
			break;
		case DLL_THREAD_ATTACH:
			//MessageBox(0,"THREAD_ATTACH","",0);
			break;
		case DLL_THREAD_DETACH:
			//MessageBox(0,"THREAD_DETACH","",0);
			break;
		case DLL_PROCESS_DETACH:
			FreeLibrary(lRich);
			Running=false;
			DestroyWindow(NRich);
			DestroyWindow(Form);
			break;
    }
    return TRUE;
}
DWORD CALLBACK Rich_ES_Callback_Get(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb)
{
	Rich_Callback_string="";
	Rich_Callback_string.SetContent((char*)pbBuff,cb-1);
	return 0;
}
DWORD CALLBACK Rich_ES_Callback_Set(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb)
{
	int ret=RtfSend?0:1;
	String*Str;
	Str=(String*)dwCookie;
	strcpy((char*) pbBuff, (char*)*Str); 
	*pcb=Str->StrLen();
	RtfSend=false;
	return ret; 
}
String GetTextRtf(HWND Rich,int Type=SF_RTF)
{
	EDITSTREAM es;
	es.pfnCallback=Rich_ES_Callback_Get;
	SendMessage(Rich,EM_STREAMOUT,Type,(LPARAM)&es);
	return Rich_Callback_string;
}
int SetTextRtf(HWND Rich,String Str)
{
	EDITSTREAM est = {(DWORD)&Str, 0, (EDITSTREAMCALLBACK)&Rich_ES_Callback_Set};
	RtfSend=true;
	if(Str.InStr(0,(String)"{\\rtf"
==-1)
	{
		SendMessage(Rich, EM_STREAMIN, SF_TEXT, (LPARAM)&est);
	}
	else
	{
		SendMessage(Rich, EM_STREAMIN, SF_RTF, (LPARAM)&est);
	}
		return 0;
}
Public int SetTextRtf(HWND Rich,char* Str)
{
	String _;
	_=Str;
	SetTextRtf(Rich,_);
	return 0;
}
		
	  
			 
	
		 
    
       
    
Номер ответа: 12 
      
Автор ответа:
 Victor
![]()
![]()
![]()
![]()
ICQ: 345743490 
Вопросов: 42
Ответов: 385
      
 Web-сайт:  
 Профиль |  | #12
      
Добавлено:  25.12.05 16:50
       
    
       
  
Используй Dependency Walker для проверки того, что библиотека действительно экспортирует эту функцию.
 
    
VB русский стоит что ли? Если Bad Dll Calling Convention, надо объявить функцию в библиотеке как stdcall. Я на си ничего не знаю, как именно это делать не могу сказать.
Удали пробел из имени библиотеки, для надежности.
И под конец, попробуй написать на сях программу, делающую вызов из этой самой библиотеки. Объяви ее так, как объявляются WinAPI. Если будет работать, то и на VB обязано.
Еще проверь, нет ли где еще твоей библиотечки, может VB ее там находит, а там старая версия к примеру. Поиском поищи.
		
	  
			 
	
		 
    
       
    
Номер ответа: 13 
      
Автор ответа:
 HOOLIGAN
![]()
Вопросов: 0
Ответов: 1066
      
 Профиль |  | #13
       
Добавлено:  25.12.05 17:42
       
    
       
  
Progos
 
    
Если даёшь код, то давай полный, со всеми инклюдами, хидерами и прочей требухой, иначе я его не смогу собрать.
А лучше давай просто готовую dll, и как декларировал в VB функции из dll, это правильней будет. И как вызывал тоже.
		
	  
			 
	
		 
    
       
    
Номер ответа: 14 
      
Автор ответа:
 HOOLIGAN
![]()
Вопросов: 0
Ответов: 1066
      
 Профиль |  | #14
       
Добавлено:  25.12.05 19:58
       
    
       
  
Progos, по-моему ты второй раз наступаешь на одни и те же грабли  
    
Сейчас сделал простую dll, без ричедита.
Вот с таким объявлением функции:
extern "C" __declspec(dllexport) int Func()
нихрена не работает
А с таким:
int _stdcall Func()
всё работает прекрасно. Только нужно создать файл .def, и в нём указать, что Func() идёт на экспорт. Соответственно добавить в командную строку линкера указание на файл .def.
Конечно, вроде dllexport eliminates the need for a module-definition (.DEF) file
Но на деле эта фича почему-то не работает 
		
	  
			 
	
		 
    
       
    
Номер ответа: 15 
      
Автор ответа:
 Progos
![]()
![]()
ICQ: 311715784 
Вопросов: 39
Ответов: 157
      
 Web-сайт:  
 Профиль |  | #15
      
Добавлено:  26.12.05 19:18
       
    
       
  
Объясни, как создавать этот ".def" файл