Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Передача параметров в функции dll / 20 сообщений из 20, страница 1 из 1
13.01.2005, 16:04
    #32863558
Lora__k
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача параметров в функции dll
Привет всем!
Столкнулась с такой проблемой. Может что подскажете?
Попробую объяснить:
Есть длл-ка на VC++, с помощью которой коннектюсь к БД:
fbdll.h
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
#if !defined(I_FBDLLINTRF__INCLUDED_)
#defineI_FBDLLINTRF__INCLUDED_

#include"afxdb.h"

extern "C"{

struct I_FbdllIntrf{
virtual bool ConnectFB(const char* szDSN, const char* szUId, const char* szPwd) =  0 ;

};

HRESULT GetFbDll(I_FbdllIntrf ** fbdllintrf);
typedef HRESULT (*GETINTERFACE)(I_FbdllIntrf ** fbdllintrf);

HRESULT Freefbdll(I_FbdllIntrf ** fbdllintrf);
typedef HRESULT (*FREEINTERFACE)(I_FbdllIntrf ** fbdllintrf);
}
#endif// !defined(I_FBDLLINTRF__INCLUDED_)

 

fbdll.cpp
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
#include "fbdll.h"
#include "fbdb.h"

HRESULT GetFbDll(I_FbdllIntrf ** fbdllintrf){
if(!*fbdllintrf){
*fbdllintrf= new CFBDataBase;
return S_OK;
}
return E_FAIL;
}

HRESULT Freefbdll(I_FbdllIntrf ** fbdllintrf){
if(!*fbdllintrf) return E_FAIL;
delete *fbdllintrf;
*fbdllintrf =  0 ;
return S_OK;
}



fbdb.h
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
#if !defined(I_FBDATABASE__INCLUDED_)
#defineI_FBDATABASE__INCLUDED_

#include "fbdll.h"


class CFBDataBase: public I_FbdllIntrf{
public:

CDatabase m_Database;

bool ConnectFB(const char* szDSN, const char* szUId, const char* szPwd);

CFBDataBase();
~CFBDataBase();

};

#endif// !defined(I_FBDATABASE__INCLUDED_)



fbdb.cpp
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
#include "fbdb.h"

CFBDataBase::CFBDataBase(){

}

CFBDataBase::~CFBDataBase(){
}

bool CFBDataBase::ConnectFB(const char* szDSN, const char* szUId, const char* szPwd){
try{
CString szConnectString;
szConnectString.Format(_TEXT("DSN=%s;UID=%s;PWD=%s;DIALECT=1;CHARSET=WIN1252;"), szDSN, szUId, szPwd);
m_Database.OpenEx(szConnectString, CDatabase::noOdbcDialog);
if (m_Database.IsOpen()){
AfxMessageBox("DataBase open!");
return true;
}
}
catch(CException *pEx){
pEx->ReportError();
pEx->Delete();

}
return false;
}



fbdll.def
Код: plaintext
1.
2.
3.
4.
5.
LIBRARY fbdll.dll
EXPORTS
GetFbDll
Freefbdll

 


Теперь если ее использую в VC++ - все ок!
Но мне надо в Borland C++, вот код:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
GETINTERFACE pfnfbitrf;
I_FbdllIntrf* fbitrf;
HINSTANCE hmydll;
         pfnfbitrf =  0 ;
fbitrf =  0 ;
hmydll = LoadLibrary("fbdll.dll");
if(hmydll !=  0 ){
pfnfbitrf = (GETINTERFACE)GetProcAddress(hmydll, "GetFbDll");
if(pfnfbitrf ==  0 ){
FreeLibrary(hmydll);
MessageBox("","GetFbDll not loaded",MB_ICONINFORMATION | MB_OK);
}
HRESULT hr = pfnfbitrf(&fbitrf);
if(FAILED(hr)){
FreeLibrary(hmydll);
MessageBox("","GetFbDll not send",MB_ICONINFORMATION | MB_OK);
}
}
else MessageBox("","fbdll.dll not loaded",MB_ICONINFORMATION | MB_OK);
         if(fbitrf->ConnectFB("ConnectFbServer", "SYSDBA", "masterkey")){   }
         else{
            MessageBox("","DataBase not open!",MB_ICONINFORMATION | MB_OK);
         }
         FREEINTERFACE pfnFree = (FREEINTERFACE)GetProcAddress(hmydll, "Freefbdll");
if(pfnFree !=  0 ) pfnFree(&fbitrf);
FreeLibrary(hmydll);


Так вот в функции ConnectFB параметры передаются не правильно, а конкретно я передаю (из BС++)
szDSN = "ConnectFbServer",
szUId = "SYSDBA",
szPwd = "masterkey"
А передаются (смотрю уже в длл-ке):
szDSN = произвольный набор символов, абра-кадабра какая-то...
szUId = "ConnectFbServer",
szPwd = "SYSDBA"

Кто-нибудь знает что не так?
...
Рейтинг: 0 / 0
13.01.2005, 16:24
    #32863624
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача параметров в функции dll
Наверняка соглашения о вызовах разные используются компиляторами.
__cdecl, __fastcall, __stdcall и т.п.
...
Рейтинг: 0 / 0
13.01.2005, 16:29
    #32863642
Lora__k
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача параметров в функции dll
MasterZivНаверняка соглашения о вызовах разные используются компиляторами.
__cdecl, __fastcall, __stdcall и т.п.
И как быть?
...
Рейтинг: 0 / 0
13.01.2005, 16:30
    #32863649
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача параметров в функции dll
Кстати , не можешь объяснить смысл объявления структуры
I_FbdllIntrf c виртуальным методом как extern "C" ?
...
Рейтинг: 0 / 0
13.01.2005, 16:35
    #32863667
Lora__k
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача параметров в функции dll
MasterZivКстати , не можешь объяснить смысл объявления структуры
I_FbdllIntrf c виртуальным методом как extern "C" ?
Могу :)
Это я уже от того что не получается пробовала все что только можно попробовать... :) Я ведь только учусь...
Буду благодарна, если подскажете что здесь можно сделать!
...
Рейтинг: 0 / 0
13.01.2005, 16:36
    #32863671
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача параметров в функции dll
Проверить, какие соглашения использует каждый из компиляторов (это видно по именам соотв. функций или если они C-шниые - надо читать документацию по компиляторам) и привести их в соответствие друг другу. Задать соглашения можно либо в __declspec в объявлении функции, либо путем указания компилятору соотв. ключей.
...
Рейтинг: 0 / 0
13.01.2005, 16:51
    #32863685
Lora__k
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача параметров в функции dll
MasterZivПроверить, какие соглашения использует каждый из компиляторов (это видно по именам соотв. функций или если они C-шниые - надо читать документацию по компиляторам) и привести их в соответствие друг другу. Задать соглашения можно либо в __declspec в объявлении функции, либо путем указания компилятору соотв. ключей.
Спасибо, попробую разобраться...
...
Рейтинг: 0 / 0
13.01.2005, 16:54
    #32863694
Lelikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача параметров в функции dll
Есть одно подозрение: ваш интерфейс содержит виртуальные функции, то есть на BC++ вызывает виртуальная ф-ция класса написанного на VC++. Могут различаться форматы виртуальных таблиц классов, созданных различными компиляторами.
Хотя это только мое предположение)))))))))))))))))))))))))))))))))))
________________________________________________________
Глюк - это высокоорганизованная система не поддающихся определению частиц
...
Рейтинг: 0 / 0
13.01.2005, 20:54
    #32864102
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача параметров в функции dll
Это очень наврядли - COM в Win32 все стандартизует в этом плане.
...
Рейтинг: 0 / 0
13.01.2005, 21:03
    #32864105
Lelikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача параметров в функции dll
В шаблонах ATL много дополнительных деталей, так что не все так просто)))
________________________________________________________
Глюк - это высокоорганизованная система не поддающихся определению частиц
...
Рейтинг: 0 / 0
13.01.2005, 21:54
    #32864122
Ivan:M
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача параметров в функции dll
Попробуй так, должно получиться.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
...
HRESULT __cdecl GetFbDll(I_FbdllIntrf ** fbdllintrf);
typedef HRESULT (*GETINTERFACE)(I_FbdllIntrf ** fbdllintrf);

HRESULT __cdecl Freefbdll(I_FbdllIntrf ** fbdllintrf);
typedef HRESULT (*FREEINTERFACE)(I_FbdllIntrf ** fbdllintrf);
...
...
Рейтинг: 0 / 0
14.01.2005, 10:54
    #32864563
Lora__k
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача параметров в функции dll
Ivan:MПопробуй так, должно получиться.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
...
HRESULT __cdecl GetFbDll(I_FbdllIntrf ** fbdllintrf);
typedef HRESULT (*GETINTERFACE)(I_FbdllIntrf ** fbdllintrf);

HRESULT __cdecl Freefbdll(I_FbdllIntrf ** fbdllintrf);
typedef HRESULT (*FREEINTERFACE)(I_FbdllIntrf ** fbdllintrf);
...


Нет, не получается!
...
Рейтинг: 0 / 0
14.01.2005, 11:24
    #32864631
CEMb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача параметров в функции dll
А попробуй в VC в объявлении поставить слово PASCAL.
Хотя... это, наверно, не то...
Но попробуй, вдруг поможет :)

У меня как-то была как раз такая проблема, тока в VC(dll) -> дельфи
Но там-то действительно, паскаль, а тут...
Правда, ВС на паскале написан... фиг знает...
...
Рейтинг: 0 / 0
14.01.2005, 11:32
    #32864655
Lora__k
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача параметров в функции dll
CEMbА попробуй в VC в объявлении поставить слово PASCAL.

Попробую, только в объявлении чего - струтуры, функции? Какой? :)
...
Рейтинг: 0 / 0
14.01.2005, 17:06
    #32865646
Lora__k
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача параметров в функции dll
Заработало!!!
Нужно было объявить ConnectFB как __stdcall...
Всем спасибо за участие!
...
Рейтинг: 0 / 0
14.01.2005, 18:26
    #32865782
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача параметров в функции dll
LelikkВ шаблонах ATL много дополнительных деталей, так что не все так просто)))


И при чем здесь ATL ?
...
Рейтинг: 0 / 0
15.01.2005, 15:55
    #32866375
Lelikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача параметров в функции dll
При том же, причем стандарты COM
________________________________________________________
Глюк - это высокоорганизованная система не поддающихся определению частиц
...
Рейтинг: 0 / 0
17.01.2005, 10:09
    #32867119
Alex_VC
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача параметров в функции dll
Lora__kЗаработало!!!
Нужно было объявить ConnectFB как __stdcall...
Всем спасибо за участие!

__stdcall это и есть PASCAL,
а extern "C" - __cdecl (кажется так...)
А вообще, наплодили, блин, кучу макроопределений для одного и того же спецификатора, что, на мой взгляд,более запутывает код (sorry,наболело...).
...
Рейтинг: 0 / 0
17.01.2005, 17:54
    #32868635
Lelikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача параметров в функции dll
extern "С" это не одно и тоже что и __cdecl, так как помимо правила передачи параметров в стеке extern "C" также запрещает компилятору искажать имена (добавлять сигнатуры функций)
________________________________________________________
Глюк - это высокоорганизованная система не поддающихся определению частиц
...
Рейтинг: 0 / 0
18.01.2005, 16:16
    #32870544
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача параметров в функции dll
Lelikkextern "С" это не одно и тоже что и __cdecl, так как помимо правила передачи параметров в стеке extern "C" также запрещает компилятору искажать имена (добавлять сигнатуры функций)


extern "C" ничего , кроме запрещения манглинга (декорирования имен функций) не делает. Он может быть и __cdecl, и __stdcall - любым.

extern "C" - это вообще часть языка C++, а __cdecl etc - это declspec, не часть языка.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Передача параметров в функции dll / 20 сообщений из 20, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]