Visual Basic, .NET, ASP, VBScript
 

   
   
     

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

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

 

  Вопрос: Вызов DLL Добавлено: 23.12.05 16:29  

Автор вопроса:  Progos | Web-сайт: html-expert.org.ru | ICQ: 311715784 
Подскажите такой вот вопрос:
Создал на Сях библиотеку, в ней функция

extern "C" __declspec(dllexport) int Func()
{
return 10;
}
В ВБ объявляю:
Private Declare Function Func& Lib "my DLL.dll" ()

Ну и потом просто вызываю
Пишет
Неверный вызов DLL

Функция выполняется, я проверял, но значения не возвращает. Если ставить 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
...код более CHEATабелен

 :-))

Ответить

Номер ответа: 4
Автор ответа:
 Progos



ICQ: 311715784 

Вопросов: 39
Ответов: 157
 Web-сайт: html-expert.org.ru
 Профиль | | #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
Private Declare Function Func& Lib "my DLL.dll" ()


а где dll'ка находится?
 - в App.Path
Попробуй в Win\System или System32 записать ее..

Ответить

Номер ответа: 7
Автор ответа:
 HOOLIGAN



Вопросов: 0
Ответов: 1066
 Профиль | | #7 Добавлено: 24.12.05 17:57
Никакой разницы нет, в папке с программой или в системной лежит dll.

Ответить

Номер ответа: 8
Автор ответа:
 Progos



ICQ: 311715784 

Вопросов: 39
Ответов: 157
 Web-сайт: html-expert.org.ru
 Профиль | | #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
Я вроде, все, что используется дал...

Dll давай


:)

Ответить

Номер ответа: 11
Автор ответа:
 Progos



ICQ: 311715784 

Вопросов: 39
Ответов: 157
 Web-сайт: html-expert.org.ru
 Профиль | | #11
Добавлено: 25.12.05 15:51
#include <windows.h>
#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-сайт: vt-dbnz.narod.ru
 Профиль | | #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-сайт: html-expert.org.ru
 Профиль | | #15
Добавлено: 26.12.05 19:18
Объясни, как создавать этот ".def" файл

Ответить

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

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



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