У меня есть .dll-файл с двумя функциями: SetCallback(void (*pfn)(void)) и SendAsync(char *, int). В глубине SendAsync по документации разработчиков dll происходит вызов pfn(). Отчего он может не происходить? Разработчики api молчат. При вызове из C-программы вызов происходит.
Здравствуйте, 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 за эквивалент LONG? Это нитак, В С# — long это Int64. В следсвии чего, при передаче параметра функции он приводится к Int32 со значением 0, что может быть причиной неправельного поведения вызываемой функции.
«Мы с тобой в чудеса не верим, Оттого их у нас не бывает…»
Здравствуйте, <Аноним>, Вы писали:
А>Здравствуйте!
А>У меня есть .dll-файл с двумя функциями: SetCallback(void (*pfn)(void)) и SendAsync(char *, int). В глубине SendAsync по документации разработчиков dll происходит вызов pfn(). Отчего он может не происходить? Разработчики api молчат. При вызове из C-программы вызов происходит.
это опасный вызов, нужно убедится что вся managed память используемая в обработчике колбэка залочена, т.к. к моменту вызова она может быть перемещена GC в другое место
Здравствуйте, alexandrovsasha, Вы писали:
A>Так нужно написать?
Нет. Нужно сделать так, что-бы GC.KeepAlive находился после unmanaged использования делегата. Вообще, GC.KeepAlive делать не обязательно. Достаточно лишь защитить объект от сборки мусора. Например, можно сохранить созданный делегат в поле класса (если класс имеет достаточное время жизни)
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.