Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.05.16;
Скачать: CL | DM;

Вниз

Проблема с 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.031 c
3-1082163141
juiceman
2004-04-17 04:52
2004.05.16
Microsoft SQL Server & Oracle


14-1082449384
Igorek
2004-04-20 12:23
2004.05.16
Предлагаю ввести значок "Ламер", который выдавать всем желающим.


1-1083061715
BALU1111
2004-04-27 14:28
2004.05.16
Проблема осей или ...?


8-1077695938
EthernalWonderer
2004-02-25 10:58
2004.05.16
Анимированный gif


8-1077179147
AlexV
2004-02-19 11:25
2004.05.16
Повернуть изображение в TImage на 90 градусов