вызов функции из dll (с++) в vb.net
От: stronciy77  
Дата: 25.03.11 19:26
Оценка:
господа,

Есть 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
c++ c# .net
Re: вызов функции из dll (с++) в vb.net
От: dmitry_npi Россия  
Дата: 26.03.11 08:04
Оценка:
Здравствуйте, 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"".
Атмосферная музыка — www.aventuel.net
Re[2]: вызов функции из dll (с++) в vb.net
От: stronciy77  
Дата: 26.03.11 10:36
Оценка:
_>Что значит получить результат ее работы? Функция — void — ничего не возвращает. Она записывает строку в стандартный вывод. Вы хотите ее оттуда изъять? У вас оконное приложение или консольное? Если консольная, то результат выведется на консоль. Если оконное, то, вероятно, в никуда.

В том-то и дело что приложение оконное ... жаль что я не смог сформулировать вопрос, но Вы правы, мне нужно перехватить результат работы функции.

_>Наверно, попробуйте перенаправить стандартный вывод средствами WinAPI...


Можно чуть подробнее, где копать ? То есть как организовать перенаправление через WinAPI ?

_>Не совсем понятно, что такое, по вашему, "результат работы "cout"".


Это я сам с трудом понял... Имелось в виду как раз перенаправление результатов работы вывода.
Re[3]: вызов функции из dll (с++) в vb.net
От: hardcase Пират http://nemerle.org
Дата: 26.03.11 12:57
Оценка:
Здравствуйте, stronciy77, Вы писали:


S> Это я сам с трудом понял... Имелось в виду как раз перенаправление результатов работы вывода.



System.Console.SetOut
/* иЗвиНите зА неРовнЫй поЧерК */
Re[4]: вызов функции из dll (с++) в vb.net
От: stronciy77  
Дата: 26.03.11 13:43
Оценка:
Здравствуйте, 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
Re[5]: вызов функции из dll (с++) в vb.net
От: dmitry_npi Россия  
Дата: 27.03.11 08:52
Оценка:
Здравствуйте, stronciy77, Вы писали:


S>вот нашел такой забавный способ отлавливать результат работы сишных функций ! Самое прикольное, что работает отлично, нигде ничего менять не надо,


Вот это и есть WinAPI


S>теперь вопрос как сделать так что бы перехват работы сишной dll писался не в файл, а скажем в переменную string такое вообще возможно ?


Конечно, вместо FileStream используйте другой IStream, например, MemoryStream, или реализуйте IStream сфмостоятельно, например, на основе StringBuilder.
Атмосферная музыка — www.aventuel.net
Re[6]: вызов функции из dll (с++) в vb.net
От: cvetkov  
Дата: 28.03.11 09:10
Оценка:
Здравствуйте, dmitry_npi, Вы писали:

_>Конечно, вместо FileStream используйте другой IStream, например, MemoryStream, или реализуйте IStream сфмостоятельно, например, на основе StringBuilder.


С другим стримом будут проблемы вот в этом месте
        handle = fs.Handle
        status = SetStdHandle(-11, handle)
Re[6]: вызов функции из dll (с++) в vb.net
От: HowardLovekraft  
Дата: 28.03.11 09:39
Оценка:
Здравствуйте, dmitry_npi, Вы писали:

_>Конечно, вместо FileStream используйте другой IStream


public abstract class Stream : MarshalByRefObject, IDisposable

У Рихтера в главе "Design: Base Class or Interface" иерархия дотнетных стримов приведена как классический пример построения иерархии на основе базового класса.
Re[7]: вызов функции из dll (с++) в vb.net
От: dmitry_npi Россия  
Дата: 29.03.11 17:04
Оценка:
Здравствуйте, HowardLovekraft, Вы писали:

HL>Здравствуйте, dmitry_npi, Вы писали:


_>>Конечно, вместо FileStream используйте другой IStream

HL>
HL>
HL>public abstract class Stream : MarshalByRefObject, IDisposable
HL>

HL>У Рихтера в главе "Design: Base Class or Interface" иерархия дотнетных стримов приведена как классический пример построения иерархии на основе базового класса.


Черт, недоглядел. Ну да, я имел в виду абстрактный базовый класс всех этих стримов...
Атмосферная музыка — www.aventuel.net
Re[7]: вызов функции из dll (с++) в vb.net
От: dmitry_npi Россия  
Дата: 29.03.11 17:33
Оценка:
Здравствуйте, cvetkov, Вы писали:


C>С другим стримом будут проблемы вот в этом месте

C>
C>        handle = fs.Handle
C>        status = SetStdHandle(-11, handle)
C>


Да, действительно, дескриптора файла-то нет ...
Ну тогда, может быть, извратиться через отображаемые файлы, используя файл подкачки? В .Net4 и класс есть — MemoryMappedViewStream.
Я, правда, сам не пробовал, чисто теоретически предполагаю...
Атмосферная музыка — www.aventuel.net
Re[7]: вызов функции из dll (с++) в vb.net
От: stronciy77  
Дата: 30.03.11 21:08
Оценка:
Здравствуйте, HowardLovekraft, Вы писали:
HL>public abstract class Stream : MarshalByRefObject, IDisposable


Прошу прощения, но можно привести маленький пример реализации такого подхода ...
А то я уже который день пробую, погряз в глубинах "маршалинга" но никак не могу получить результат
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.