Forth
http://www.fforum.winglion.ru/

Quark.dll + Visual C#
http://www.fforum.winglion.ru/viewtopic.php?f=23&t=2835
Страница 1 из 2

Автор:  incubus370 [ Вс апр 08, 2012 19:48 ]
Заголовок сообщения:  Quark.dll + Visual C#

Вопрос как подключить Quark.dll к С#. Самостоятельные попытки ни кчему не привели (горы ошибок и ничего больше)

Автор:  Hishnik [ Вс апр 08, 2012 20:08 ]
Заголовок сообщения:  Re: Quark.dll + Visual C#

Оно хотя бы выполняет Init() без ошибок?

Автор:  Antender [ Вс апр 08, 2012 21:51 ]
Заголовок сообщения:  Re: Quark.dll + Visual C#

csc не поддерживает fastcall(т.е. регистр).
Спрашивающий не знает английский и/или как работают вызовы dll.

Автор:  Hishnik [ Вс апр 08, 2012 22:45 ]
Заголовок сообщения:  Re: Quark.dll + Visual C#

Там параметр нужен только для Evaluate. Сама функция Evaluate реализована с регистровой конвенцией, а для передачи согласно C-calls есть функция EvaluateC.

Автор:  Hishnik [ Вс апр 08, 2012 23:17 ]
Заголовок сообщения:  Re: Quark.dll + Visual C#

Вот что у меня получилось. На форме есть текстовая строка, кнопка и метка. Думаю, положить их туда не проблема.

Код:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;


using System.Runtime.InteropServices; // вот это я добавил, покопавшись по справке

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        [DllImport("quark.dll", EntryPoint = "Init")]
        public static extern void Init();

        [DllImport("quark.dll", EntryPoint = "EvaluateC")]
        public static extern int EvaluateC(string str);

        public Form1()
        {
            InitializeComponent();
            Init();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (EvaluateC(textBox1.Text) == 0)
                label1.Text = "Ok";
            else label1.Text = "Error";
        }
    }
}

Автор:  incubus370 [ Пн апр 09, 2012 07:18 ]
Заголовок сообщения:  Re: Quark.dll + Visual C#

Хищник писал(а):
Вот что у меня получилось. На форме есть текстовая строка, кнопка и метка. Думаю, положить их туда не проблема.

Код:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;


using System.Runtime.InteropServices; // вот это я добавил, покопавшись по справке

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        [DllImport("quark.dll", EntryPoint = "Init")]
        public static extern void Init();

        [DllImport("quark.dll", EntryPoint = "EvaluateC")]
        public static extern int EvaluateC(string str);

        public Form1()
        {
            InitializeComponent();
            Init();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (EvaluateC(textBox1.Text) == 0)
                label1.Text = "Ok";
            else label1.Text = "Error";
        }
    }
}


Хищник так в руководстве по quark'у нет ничего про EvaluateC.
Init проходит и с ним проблем нет. Проблемы возникают при передаче строки.

PS. Antender, в руководстве по quark'у для особо одаренных написано, что используется fastcall вызов процедур с передачей параметра в EAX. так что учи английский сам.

Автор:  Hishnik [ Пн апр 09, 2012 08:29 ]
Заголовок сообщения:  Re: Quark.dll + Visual C#

incubus370 писал(а):
Хищник так в руководстве по quark'у нет ничего про EvaluateC.

Хм... может быть, старая версия документации? Проблема с передачей параметров уже обсуждалась на форуме, после этого и была добавлена версия EvaluateC. По крайней мере, приведенный фрагмент что-то там выполняет :) Что - не проверял, проверял код ошибки после EvaluateC. На вменяемых строках, как положено, дает 0, на asdfgh дает ошибку.

Автор:  diver [ Пн апр 09, 2012 08:30 ]
Заголовок сообщения:  Re: Quark.dll + Visual C#

incubus370, уровень +1, опыт +5 :)

Автор:  Antender [ Пн апр 09, 2012 12:26 ]
Заголовок сообщения:  Re: Quark.dll + Visual C#

incubus370 писал(а):
PS. Antender, в руководстве по quark'у для особо одаренных написано, что используется fastcall вызов процедур с передачей параметра в EAX. так что учи английский сам.


Английский нужен не для чтения манов от хищника на русском , в которых не было ничего про EvaluateC, а для MSDN в котором чёрным по белому написано, что fastcall не поддерживается! С cdecl конечно проблем нет.

Автор:  Hishnik [ Пн апр 09, 2012 13:05 ]
Заголовок сообщения:  Re: Quark.dll + Visual C#

Я уже проверил, оно работает с EvaluateC. Считает, оставляет на стеке что нужно. Правда, графический экран вытаскивается наружу прямо-таки с черепашьей скоростью (ср. с OpenGL).

Автор:  incubus370 [ Ср апр 11, 2012 05:13 ]
Заголовок сообщения:  Re: Quark.dll + Visual C#

Хищник писал(а):
incubus370 писал(а):
Хищник так в руководстве по quark'у нет ничего про EvaluateC.

Хм... может быть, старая версия документации? Проблема с передачей параметров уже обсуждалась на форуме, после этого и была добавлена версия EvaluateC. По крайней мере, приведенный фрагмент что-то там выполняет :) Что - не проверял, проверял код ошибки после EvaluateC. На вменяемых строках, как положено, дает 0, на asdfgh дает ошибку.


У меня руководство по 28 билду. В нем про EvaluateC к сожалению ничего не упоминалось. Взял его я у forther'a.

Автор:  incubus370 [ Ср апр 11, 2012 05:18 ]
Заголовок сообщения:  Re: Quark.dll + Visual C#

Хищник писал(а):
Я уже проверил, оно работает с EvaluateC. Считает, оставляет на стеке что нужно. Правда, графический экран вытаскивается наружу прямо-таки с черепашьей скоростью (ср. с OpenGL).


По умолчанию при вызове EvaluateC окно OpenGL обязано появиться или нет? Я лично его не заметил.

Автор:  Hishnik [ Ср апр 11, 2012 08:30 ]
Заголовок сообщения:  Re: Quark.dll + Visual C#

incubus370 писал(а):
По умолчанию при вызове EvaluateC окно OpenGL обязано появиться или нет? Я лично его не заметил.

В dll оно никак не появится. quark.dll - это не приложение, а библиотека, она предоставляет ресурсы, но никаких элементов управления не создает. Расчет на то, что такие элементы есть в вызывающем приложении.

Автор:  incubus370 [ Сб апр 14, 2012 11:22 ]
Заголовок сообщения:  Re: Quark.dll + Visual C#

Если осуществить подключение библиотеки в нескольких потоках, и в каждом из них работать с библиотекой индивидуально т. е. есть кусок следующий кусок кода есть в кажом потоке

Init();
Evaluate();
Done();

то для кажого из потоков библиотека будет ли представлять свой терминал/консоль?

Автор:  Hishnik [ Сб апр 14, 2012 11:51 ]
Заголовок сообщения:  Re: Quark.dll + Visual C#

incubus370 писал(а):
Если осуществить подключение библиотеки в нескольких потоках, и в каждом из них работать с библиотекой индивидуально т. е. есть кусок следующий кусок кода есть в кажом потоке

Init();
Evaluate();
Done();

то для кажого из потоков библиотека будет ли представлять свой терминал/консоль?

Да, каждый раз Init() выделит свои области памяти для кода и данных через GlobalAlloc. Будет несколько независимых форт-машин.

Страница 1 из 2 Часовой пояс: UTC + 3 часа [ Летнее время ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/