2 / 2 / 1
Регистрация: 12.03.2015
Сообщений: 99
1

На C# написать dll, функции которой можно будет вызывать в программе на Delphi

26.05.2015, 18:49. Показов 2312. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Не знаю в какой раздел писать.
В общем, нужно на с# написать dll , функции которой можно будет вызывать в программе на делфи.
Нашел вот такое [url]

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
 
namespace DLLEx
{
    public class Func
    {
        public static void ShowMess(string s)
        {
            Go(s);
        }
 
        private static void Go(string s)
        {
            MessageBox.Show(s);
            return;
        }
    }
}
Delphi
1
2
3
4
5
6
7
8
9
var
 
function ShowMess(AText: String): string; external 'твоя dll'; 
 
begin
 
ShowMess('блa бла бла');
 
end;
Все делаю так же, но в строке
Delphi
1
end;
и в строке после данной строки
Появляется ошибка:
Delphi
1
E2029 '.' expected but ';' found
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.05.2015, 18:49
Ответы с готовыми решениями:

Можно передавать и вызывать из функции в DLL динамические массивы?
Мне нужно создать перегруженные функции удаления элемента из динамического массива с заданным...

Написать программу, в которой можно будет переключаться между модулями...
Написать модуль к каждой задаче, написать программу(где будут все модули этих задач) в которой...

Как вызывать функции из DLL?
Здравствуйте. Как вызывать функции из DLL? Вот например, если функция представляет собой что -...

Можно ли процедуры вынести в отдельный файл и вызывать в основной программе
У меня есть некоторая программа с процедурами и функциями. Вопрос, можно ли процедуры вынести в...

9
5705 / 2296 / 466
Регистрация: 20.11.2009
Сообщений: 7,720
Записей в блоге: 1
26.05.2015, 18:53 2
String нельзя из dll передавать, нужно указатель передавать на начало твоих строковых данных, тобишь используют PChar для этого, как с этим поступить в c# я не знаю, нужно читать как там передаются такие данные
0
2 / 2 / 1
Регистрация: 12.03.2015
Сообщений: 99
26.05.2015, 19:28  [ТС] 3
ладно, есть идея костыля. Сохранять результат выполнения функции в n.txt , n-число. в ответ передается число,а делфи-программа читает файл этот.

Но я вообще не могу понять. Єтот шаблон не работает, который я нашел. Кто подскажет, как осуществить работу с шарп дллки в делфи?
0
5705 / 2296 / 466
Регистрация: 20.11.2009
Сообщений: 7,720
Записей в блоге: 1
26.05.2015, 20:35 4
стой функцию же не в var разделе надо разсмещать, где-то выше, по коду размести

Добавлено через 25 минут
что-то я тебе тут ерунды всякой насоветовал..

но я сейчас сам поигрался с этим, но видно так нельзя делать. так как в c# мы создем класс а тут пытаемся обратиться как к обычной библиотеке. как-то через COM это проворачивать надо. а в примере который ты нашел, там что-то все бухты-барахты.. непонятно что хотел автор на другом форуме этим сказать
0
5705 / 2296 / 466
Регистрация: 20.11.2009
Сообщений: 7,720
Записей в блоге: 1
26.05.2015, 22:09 5
Лучший ответ Сообщение было отмечено MorgunZ как решение

Решение

в общем, как создать и использовать тебе dll ))) если будет желание поковыряйся, мне интересно стало я поковырялся и у меня получилось, в общем создаем COM локальный сервер в виде dll'ки как описано вот тут вот за 11 шагов, http://stackoverflow.com/quest... x-com-in-c

у меня получилось нечто такое
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
using System.Runtime.InteropServices;
 
//using System.Windows.Forms;
 
namespace Launcher
{
 
    [InterfaceType(ComInterfaceType.InterfaceIsDual), Guid("C8D80BAE-83B0-4312-A72D-29044EDACBA1")]
    public interface ILauncher
    {
        void launch();
        string Hello(string str);
        int Add(int a, int b);
    }
 
    [ClassInterface(ClassInterfaceType.None), Guid("23008950-183C-4EB2-85E8-DAD5E49E3096"), ProgId("Test.ComObjFromCCharp")]
    public class Launcher : ILauncher
    {
 
        public string Hello(string str)
        {
            return str + '\n' + str;
        }
 
        public int Add(int a, int b)
        {
            return a + b;
        }
 
        public void launch()
        {
            Console.WriteLine("Hello world");
 
        }
 
    }
}
после компиляции этого кода, появится в проекте, куда все компилировалось, dll'ка и TLB'шка, как на картинке примерно
На C# написать dll, функции которой можно будет вызывать в программе на Delphi


далее в дельфи, устанавливаем эту tlb'шку, через импорт компонентов(надеюсь знаешь как, если нет найди в инете, у меня дельфи немецкий, не смогу подробно объясниить куда тыкать)

далее если все получилось импортировать удачно, туда куда импортировали появится .pas файл, с названием того что импортировали и на окончании TLB, вот его скопируем в папку с проектом, и в uses подлючим


и далее вот такой вот простенький код на дельфи, который запускает весь механизм в действие!

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
program Project1;
 
{$APPTYPE CONSOLE}
 
uses
  SysUtils, TestComObj_TLB;
var test: ILauncher;
begin
 
  test := CoLauncher.Create;
  test.launch;
  Writeln(test.Hello('Ololo'));
  Writeln(test.Add(5, 13));
 
  Readln;
 
end.
и вот такой вот результат
На C# написать dll, функции которой можно будет вызывать в программе на Delphi


приложу все что мне потребовалось для создания данной махины
-программа на C#
-скомпилированные причуды из TLB
-тест-проект на дельфи

надеюсь поможет дальше
Вложения
Тип файла: 7z com ccharp_delphi.7z (698.0 Кб, 102 просмотров)
2
2 / 2 / 1
Регистрация: 12.03.2015
Сообщений: 99
27.05.2015, 21:29  [ТС] 6
Позже попробую, но огромное спасибо за такой полный и ясный ответ, даже с скриншотами и прилагающимися файлами. Огромное спасибо.
0
0 / 0 / 0
Регистрация: 21.02.2018
Сообщений: 20
17.04.2019, 06:34 7
Если запускаю пример мне выдает ошибку
---------------------------
Debugger Exception Notification
---------------------------
Project Project1.exe raised exception class EOleSysError with message 'Не был произведен вызов CoInitialize'. Process stopped. Use Step or Run to continue.
---------------------------
OK Help
---------------------------

Добавлено через 17 минут
А сейчас ругается на строку
test := CoLauncher.Create;

project raised exception class eolesyserror with message. класс не зарегистрирован
0
5705 / 2296 / 466
Регистрация: 20.11.2009
Сообщений: 7,720
Записей в блоге: 1
17.04.2019, 10:16 8
если вы сделали все шаги, которые описаны, проблем возникнуть не должно, у меня же как-то 4 года назад это работало
Цитата Сообщение от illiona Посмотреть сообщение
класс не зарегистрирован
значит точно не все шаги были сделаны, тогда

http://docwiki.embarcadero.com... tion_Toolм
0
0 / 0 / 0
Регистрация: 21.02.2018
Сообщений: 20
18.04.2019, 06:10 9
Теперь ошибка такая выскакивает Ошибка: access violation at address 0045fd9b in module project1.exe read of address 00000000
0
Модератор
9336 / 6114 / 2394
Регистрация: 21.01.2014
Сообщений: 26,113
Записей в блоге: 3
18.04.2019, 07:15 10
Цитата Сообщение от illiona Посмотреть сообщение
read of address 00000000
Какой-то объект не создали и пытаетесь им оперировать...
0
18.04.2019, 07:15
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.04.2019, 07:15
Помогаю со студенческими работами здесь

Как правильно вызывать функции в программе
Логику программы вроде реализовал, подскажите пожалуйста как это все теперь собрать. Мне бы это...

Добавление функции, чтобы ее можно было вызывать с функции загрузки формы
Здравствуйте! Подскажите как правильно добавить функцию, чтоб ее можно было вызывать с функции...

Написать программу, с помощью которой изображение будет разбиваться по пикселям и будет создаваться матрица
помогите пожалуйста, очень нужна помощь! нужно написать программу, с помощью которой изображение...

как к GUI-проекту на qt creatore подключить dll сделанную в MSVS2010 и вызывать из нее функции?
Сделал проект типа калькулятора на 3 текстовых полях(2 числа и результат)+ 4 кнопки(+-*/)... в длл...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru