Страница: 1 | 2 |
Вопрос: Вызов DLL
Добавлено: 23.12.05 16:29
Автор вопроса: Progos | Web-сайт:
Подскажите такой вот вопрос:
Создал на Сях библиотеку, в ней функция
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" файл