Форум: "Основная";
Текущий архив: 2004.05.16;
Скачать: [xml.tar.bz2];
ВнизПроблема с dll на дельфи, при вызове из VC++ 6 Найти похожие ветки
← →
dstupin (2004-04-30 09:38) [0]Сейчас будет много кода(( но по другому нельзя(
Сообщение не очень относиться к этому форуму, т.к. проблема при написании программы в VC++ 6.0, но при использовании dll, напсанной в delphi.
Проблема вот в чем, что при вызове функции ShopStartListen, в качестве параметров которой передается структура из 3-х функций вываливается сообщение о несоответсвии функции её описанию, но сказать, где это просходит, в библиотеке или в программе - не могу. Если передать функции полностью обнуленную структуру, то вываливается с access violatation, но в библиотеке!
typedef UINT (__stdcall * IWCFunction)();
typedef UINT (__stdcall * FWCFunction)();
typedef void (__stdcall * ShopProc_GetMoneyRequest)(WORD, DWORD, ParamsRecord, char*, WORD&, ContractData&, ReplyResource&);
typedef void (__stdcall * ShopProc_GetIncomingPaymentApproval)(WORD, IncomingPaymentInfo, ShortDescription&, int &, DWORD&, ReplyResource&);
typedef void (__stdcall * ShopProc_PaymentAuthorizationResult)(PaymentAuthorizationInfo, ReplyResource&);
struct ShopProcsTable
{
ShopProc_GetMoneyRequest GetMoneyRequest;
ShopProc_GetIncomingPaymentApproval GetIncomingPaymentApproval;
ShopProc_PaymentAuthorizationResult PaymentAuthorizationResult;
};
typedef DWORD (__stdcall * SSLFunction)(char *, const ShopProcsTable);
void CALLBACK GetMoneyRequest(WORD ErrorCode, DWORD Cypher, ParamsRecord ContractModifier, char* PayerAddress, WORD& RequestMode, ContractData& ContractData, ReplyResource& ReplyResource)
{
}
void CALLBACK GetIncomingPaymentApproval(WORD ErrorCode, IncomingPaymentInfo PaymentInfo, ShortDescription& shortDescription, int & ConfirmAction, DWORD& BankConnection, ReplyResource& replyResource)
{
}
void CALLBACK PaymentAuthorizationResult(PaymentAuthorizationInfo paymentAuthorizationInfo, ReplyResource& replyResource)
{
}
bool CWallet::LoadPayCash()
{
m_Module = LoadLibrary("walletconnect.dll");
if( m_Module != NULL ) {
InitializeWalletConnection = (IWCFunction)GetProcAddress(m_Module, "InitializeWalletConnection");
FinalizeWalletConnection = (FWCFunction)GetProcAddress(m_Module, "FinalizeWalletConnection");
ShopProcsTable MyTable;
MyTable.GetMoneyRequest = GetMoneyRequest;
MyTable.GetIncomingPaymentApproval = GetIncomingPaymentApproval;
MyTable.PaymentAuthorizationResult = PaymentAuthorizationResult;
ShopStartListen = (SSLFunction)GetProcAddress(m_Module, "ShopStartListen");
char * str = "ЛокМаг";
DWORD Ret = ShopStartListen(str, MyTable);
}
else {
return true;
}
if( InitializeWalletConnection != NULL && FinalizeWalletConnection != NULL )
return true;
else
return false;
}
А вот как эти три функции в структуре MyTable выглядят в дельфи :
Формат вызова:
function ShopStartListen(Name:PChar; const ShopProcs:TShopProcsTable):DWord; stdcall;
Параметры:
Name:PChar - имя локальной связи Магазина. Это имя должно быть указано в сетевых параметрах Кошелька-кассы. Имя не должно превышать 15 символов и не должно содержать символ “обратной черты” (“\”).
ShopProcs: TShopProcsTable - массив точек входа в процедуры Магазина (реализация интерфейсных функций со стороны Магазина).
TShopProcsTable = packed record
GetMoneyRequest: TShopProc_GetMoneyRequest;
GetIncomingPaymentApproval: TShopProc_GetIncomingPaymentApproval;
PaymentAuthorizationResult: TShopProc_PaymentAuthorizationResult;
end;
Если вы дочитали до сюда, то хотелось бы извиниться, за столько потраченного вами времени, спасибо!
Могу выслать полностью исходный код, примеры на дельфи и описание библиотеки.
Спасибо за внимание.
← →
PVOzerski © (2004-04-30 10:18) [1]>Проблема вот в чем, что при вызове функции ShopStartListen, в
>качестве параметров которой передается структура из 3-х функций
>вываливается сообщение о несоответсвии функции её описанию
Странно как-то. Такое должно бы происходить на этапе компиляции, а не в рантайме, и тогда ищи ошибку в пределах си-шного кода.
← →
dstupin (2004-04-30 11:39) [2]>Странно как-то. Такое должно бы происходить на этапе >компиляции, а не в рантайме, и тогда ищи ошибку в пределах си->шного кода.
Почему на компиляции?
Синтаксически всё правильно.
И конечно ошибка в сишном коде) библиотека уже готовая.
Ещё раз повторюсь :
Если передать функции полностью обнуленную структуру, то вываливается с access violatation, но в библиотеке!
Скорее всего, после вызова ShopStartListen вызываются функции, переданные ей в структуре-параметре, и именно в них ошибка!
Вот я и привел как они выглядят у меня и как они выглядят в дельфи.
С размерами структур всё нормально, сверял. Функции и там и там stdcall.
← →
Внук © (2004-04-30 11:50) [3]В качестве догадки - а не валяется ли где-нибудь старая версия этой DLL? Например, в системном каталоге :))
← →
goozman (2004-04-30 12:15) [4]В DLL стоит в uses ShareMem?!
← →
dstupin (2004-04-30 12:27) [5]dll уже готовая, её успешно использовали в delphi проектах, версия только одна.
← →
Григорьев Антон (2004-04-30 12:54) [6]А какое выравнивание мспользуется при описании структуры на C++? В программе вы выравнивание вообще отменили, а вот в библиотеке я этой отмены не вижу. По умолчанию VC++ выравнивает поля стркутур на границу аж 8 байт. Изменить выравнивание можно с помощью директивы #pragma pack или в опциях проекта.
← →
dstupin (2004-05-04 09:35) [7]В VC++ выравнивание можно ещё поставить в настройках компилятора, оно установленно в 1 байт.
По умолчанию оно действительно 8 байт.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.05.16;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.035 c