взаимодействие внешнего api и .net
От: Аноним  
Дата: 10.09.08 09:45
Оценка:
Здравствуйте!

У меня есть .dll-файл с двумя функциями: SetCallback(void (*pfn)(void)) и SendAsync(char *, int). В глубине SendAsync по документации разработчиков dll происходит вызов pfn(). Отчего он может не происходить? Разработчики api молчат. При вызове из C-программы вызов происходит.

Извините за неряшливо заданный вопрос.

Александров Саша.
Re: взаимодействие внешнего api и .net
От: RushDevion Россия  
Дата: 10.09.08 10:12
Оценка:
Для начала было бы неплохо увидеть .NET cигнатуры функций.
Re[2]: взаимодействие внешнего api и .net
От: alexandrovsasha Россия  
Дата: 10.09.08 10:25
Оценка:
Здравствуйте, RushDevion, Вы писали:

RD>Для начала было бы неплохо увидеть .NET cигнатуры функций.


//void TRANS2QUIK_TRANSACTION_REPLY_CALLBACK(long nTransactionResult, long nTransactionExtendedErrorCode,
// long nTransactionReplyCode, DWORD dwTransId, double dOrderNum, LPSTR lpstrTransactionReplyMessage)
public delegate void TransactionReplyCallback(QuikResult transactionResult, int errorCode,
int transactionReplyCode, int transID, double orderNum, StringBuilder transactionReplyMsg);

//long TRANS2QUIK_SET_TRANSACTIONS_REPLY_CALLBACK (TRANS2QUIK_TRANSACTION_ REPLY_CALLBACK pfTransactionReplyCallback,
// long* pnExtendedErrorCode, LPSTR lpstrErrorMessage, DWORD dwErrorMessageSize)
[DllImport(Trans2QUIK.DLL, CharSet = CharSet.Ansi, EntryPoint = "TRANS2QUIK_SET_TRANSACTIONS_REPLY_CALLBACK")]
public static extern QuikResult SetTransactionsReplyCallback(TransactionReplyCallback replyCallback,
ref int errorCode, StringBuilder errorMsg, int errorMsgSize);

//long TRANS2QUIK_SEND_ASYNC_TRANSACTION (LPSTR lpstTransactionString, long* pnExtendedErrorCode,
//LPSTR lpstErrorMessage, DWORD dwErrorMessageSize)
[DllImport(Trans2QUIK.DLL, CharSet = CharSet.Ansi, EntryPoint = "TRANS2QUIK_SEND_ASYNC_TRANSACTION")]
public static extern QuikResult SendAsyncTransaction(String transactionString, ref int errorCode,
StringBuilder errorMsg, int errorMsgSize);
Re[3]: взаимодействие внешнего api и .net
От: Аноним  
Дата: 11.09.08 06:59
Оценка:
Никто не сталкивался с такой проблемой?
Люди-программисты, помогите, пожалуйста!
Re[3]: взаимодействие внешнего api и .net
От: meerius Канада  
Дата: 11.09.08 15:23
Оценка:
Конечно из того, что Вы спросили понять ничего нельзя, я попробую только предположить.
Думаю, Вы принемаете С#-ий long за эквивалент LONG? Это нитак, В С# — long это Int64. В следсвии чего, при передаче параметра функции он приводится к Int32 со значением 0, что может быть причиной неправельного поведения вызываемой функции.
«Мы с тобой в чудеса не верим, Оттого их у нас не бывает…»
Re: взаимодействие внешнего api и .net
От: TK Лес кывт.рф
Дата: 11.09.08 18:39
Оценка: +1
Здравствуйте, Аноним, Вы писали:

А>Извините за неряшливо заданный вопрос.


Распространенный вариант — забыли сделать созданному делегату GC.KeepAlive и его собирает сборщик мусора
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[2]: взаимодействие внешнего api и .net
От: alexandrovsasha Россия  
Дата: 12.09.08 07:07
Оценка:
Здравствуйте, TK, Вы писали:

TK>Распространенный вариант — забыли сделать созданному делегату GC.KeepAlive и его собирает сборщик мусора


delegate void DelegateName(int x);
void Foo(int x)
{}
void Bar()
{
D d = new D(Foo);
GC.KeepAlive(d);
}

Так нужно написать?
Re: взаимодействие внешнего api и .net
От: _Morpheus_  
Дата: 15.09.08 16:17
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Здравствуйте!


А>У меня есть .dll-файл с двумя функциями: SetCallback(void (*pfn)(void)) и SendAsync(char *, int). В глубине SendAsync по документации разработчиков dll происходит вызов pfn(). Отчего он может не происходить? Разработчики api молчат. При вызове из C-программы вызов происходит.


это опасный вызов, нужно убедится что вся managed память используемая в обработчике колбэка залочена, т.к. к моменту вызова она может быть перемещена GC в другое место
... << RSDN@Home 1.2.0 alpha rev. 676>>
Re[3]: взаимодействие внешнего api и .net
От: TK Лес кывт.рф
Дата: 15.09.08 19:32
Оценка:
Здравствуйте, alexandrovsasha, Вы писали:

A>Так нужно написать?


Нет. Нужно сделать так, что-бы GC.KeepAlive находился после unmanaged использования делегата. Вообще, GC.KeepAlive делать не обязательно. Достаточно лишь защитить объект от сборки мусора. Например, можно сохранить созданный делегат в поле класса (если класс имеет достаточное время жизни)
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.