Есть dll написанная на с++ в ней реализована банальная функция
extern"C"__declspec(dllexport) void LetterList()
{
cout << "This function was called from LetterList() " << endl;
}
Вопрос, как подключить ПРАВИЛЬНО эту dll в vb.net/c# что бы при вызове функции LetterList() получить результат ее работы, то есть строку "This function was called from LetterList()" ?
Буду признателен за помощь
p.s. почему не в .net форуме ? да я просто сломал голову, дело в том что если функция объявляется char и вызывается return"bla bla bla"; то в .net программах все проходит отлично, но как только я хочу получить результат работы "cout" то начинаются непонятные траблы
26.03.11 13:15: Перенесено модератором из 'C/C++' — Odi$$ey
Здравствуйте, stronciy77, Вы писали:
S>господа,
S>Есть dll написанная на с++ в ней реализована банальная функция
S>
S>extern"C"__declspec(dllexport) void LetterList()
S>{
S> cout << "This function was called from LetterList() " << endl;
S>}
S>
S>Вопрос, как подключить ПРАВИЛЬНО эту dll в vb.net/c# что бы при вызове функции LetterList() , то есть строку "This function was called from LetterList()" ?
S>Буду признателен за помощь
S>p.s. почему не в .net форуме ? да я просто сломал голову, дело в том что если функция объявляется char и вызывается return"bla bla bla"; то в .net программах все проходит отлично, но как только я хочу получить результат работы "cout" то начинаются непонятные траблы
Что значит получить результат ее работы? Функция — void — ничего не возвращает. Она записывает строку в стандартный вывод. Вы хотите ее оттуда изъять? У вас оконное приложение или консольное? Если консольная, то результат выведется на консоль. Если оконное, то, вероятно, в никуда.
Наверно, попробуйте перенаправить стандартный вывод средствами WinAPI...
Не совсем понятно, что такое, по вашему, "результат работы "cout"".
_>Что значит получить результат ее работы? Функция — void — ничего не возвращает. Она записывает строку в стандартный вывод. Вы хотите ее оттуда изъять? У вас оконное приложение или консольное? Если консольная, то результат выведется на консоль. Если оконное, то, вероятно, в никуда.
В том-то и дело что приложение оконное ... жаль что я не смог сформулировать вопрос, но Вы правы, мне нужно перехватить результат работы функции.
_>Наверно, попробуйте перенаправить стандартный вывод средствами WinAPI...
Можно чуть подробнее, где копать ? То есть как организовать перенаправление через WinAPI ?
_>Не совсем понятно, что такое, по вашему, "результат работы "cout"".
Это я сам с трудом понял... Имелось в виду как раз перенаправление результатов работы вывода.
Здравствуйте, hardcase, Вы писали:
H>Здравствуйте, stronciy77, Вы писали:
H>System.Console.SetOut
вот нашел такой забавный способ отлавливать результат работы сишных функций ! Самое прикольное, что работает отлично, нигде ничего менять не надо, теперь вопрос как сделать так что бы перехват работы сишной dll писался не в файл, а скажем в переменную string такое вообще возможно ?
<DllImport("Kernel32.dll", SetLastError:=True)> _
Public Shared Function SetStdHandle(ByVal device As Integer, ByVal handle As IntPtr) As Integer
End Function
<DllImport("tdll.dll")> _
Public Shared Sub NumberList()
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim status As Integer
Dim handle As IntPtr
Dim fs As FileStream
Dim sw As StreamWriter
fs = New FileStream("console.txt", FileMode.Create)
sw = New StreamWriter(fs)
sw.AutoFlush = True
Console.SetOut(sw)
'Console.WriteLine("This is a test of output via C#.")
handle = fs.Handle
status = SetStdHandle(-11, handle)
NumberList()
End Sub
S>вот нашел такой забавный способ отлавливать результат работы сишных функций ! Самое прикольное, что работает отлично, нигде ничего менять не надо,
Вот это и есть WinAPI
S>теперь вопрос как сделать так что бы перехват работы сишной dll писался не в файл, а скажем в переменную string такое вообще возможно ?
Конечно, вместо FileStream используйте другой IStream, например, MemoryStream, или реализуйте IStream сфмостоятельно, например, на основе StringBuilder.
Здравствуйте, dmitry_npi, Вы писали:
_>Конечно, вместо FileStream используйте другой IStream, например, MemoryStream, или реализуйте IStream сфмостоятельно, например, на основе StringBuilder.
С другим стримом будут проблемы вот в этом месте
handle = fs.Handle
status = SetStdHandle(-11, handle)
Здравствуйте, dmitry_npi, Вы писали:
_>Конечно, вместо FileStream используйте другой IStream
public abstract class Stream : MarshalByRefObject, IDisposable
У Рихтера в главе "Design: Base Class or Interface" иерархия дотнетных стримов приведена как классический пример построения иерархии на основе базового класса.
Здравствуйте, HowardLovekraft, Вы писали:
HL>Здравствуйте, dmitry_npi, Вы писали:
_>>Конечно, вместо FileStream используйте другой IStream HL> HL>
HL>public abstract class Stream : MarshalByRefObject, IDisposable
HL>
HL>У Рихтера в главе "Design: Base Class or Interface" иерархия дотнетных стримов приведена как классический пример построения иерархии на основе базового класса.
Черт, недоглядел. Ну да, я имел в виду абстрактный базовый класс всех этих стримов...
C>С другим стримом будут проблемы вот в этом месте C>
C> handle = fs.Handle
C> status = SetStdHandle(-11, handle)
C>
Да, действительно, дескриптора файла-то нет ...
Ну тогда, может быть, извратиться через отображаемые файлы, используя файл подкачки? В .Net4 и класс есть — MemoryMappedViewStream.
Я, правда, сам не пробовал, чисто теоретически предполагаю...
Здравствуйте, HowardLovekraft, Вы писали: HL>public abstract class Stream : MarshalByRefObject, IDisposable
Прошу прощения, но можно привести маленький пример реализации такого подхода ...
А то я уже который день пробую, погряз в глубинах "маршалинга" но никак не могу получить результат