Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.72/25: Рейтинг темы: голосов - 25, средняя оценка - 4.72
1 / 1 / 4
Регистрация: 20.10.2012
Сообщений: 130

Получить доступ из dll к данным из программы

29.11.2012, 07:36. Показов 5365. Ответов 36
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть dll к программме А на C++ и есть программа Б на C#. Необходимо получить доступ из dll к данным из программы Б. Причем доступ высокоскоростной и постоянный.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
29.11.2012, 07:36
Ответы с готовыми решениями:

Как получить доступ к данным
Подскажите пожалуйста как получить доступ к полученой таблице после SQL-запроса в компонентах ADO?

доступ к данным другой программы
Доброго времени суток :) Есть некая программа с которой грубо говоря нужно взять данные, объясните как собственно говоря это...

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

36
1 / 1 / 4
Регистрация: 20.10.2012
Сообщений: 130
30.11.2012, 14:31  [ТС]
Студворк — интернет-сервис помощи студентам
Что за def файл?

Добавлено через 5 минут
Программа А не принимает в dll строку:
C++
1
void __declspec(dllexport) SetCountA(double count);
А вот если так:

C++
1
2
3
#include "trans2quik_api.h"
#pragma comment(lib,"TRANS2QUIK.lib")
 extern "C" void __stdcall TRANS2QUIK_ConnectionStatusCallback (long nConnectionEvent, long nExtendedErrorCode, LPCSTR lpcstrInfoMessage);
да в отдельном файле trans2quik_api.h:
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
#pragma once
 
#ifdef TRANS2QUIK_EXPORTS
#define TRANS2QUIK_API __declspec (dllexport)
#pragma message ("TRANS2QUIK_API defined as __declspec (dllexport)")
#else
//#pragma message ("TRANS2QUIK_API defined as __declspec (dllimport)")
#define TRANS2QUIK_API __declspec (dllimport)
#endif
 
#ifdef __cplusplus
extern "C" {
#endif
 
typedef void (__stdcall *TRANS2QUIK_CONNECTION_STATUS_CALLBACK) (long nConnectionEvent, long nExtendedErrorCode, LPCSTR lpcstrInfoMessage);
typedef void (__stdcall *TRANS2QUIK_TRANSACTION_REPLY_CALLBACK) (long nTransactionResult, long nTransactionExtendedErrorCode, long nTransactionReplyCode, DWORD dwTransId, double dOrderNum, LPCSTR lpcstrTransactionReplyMessage);
 
//typedef void (__stdcall *TRANS2QUIK_CONNECTION_STATUS_CALLBACK) (long nConnectionEvent, long nExtendedErrorCode, LPSTR lpstrInfoMessage);
//typedef void (__stdcall *TRANS2QUIK_TRANSACTION_REPLY_CALLBACK) (long nTransactionResult, long nTransactionExtendedErrorCode, long nTransactionReplyCode, DWORD dwTransId, double dOrderNum, LPSTR lpstrTransactionReplyMessage);
 
 
 
#ifdef __cplusplus
}
#endif
то все устраивает.
Как мне переделать мою строку экспорта, чтобы программа A приняла dll? Как то по другому надо ее записать.

Добавлено через 6 минут
Я так понимаю что здесь используется #pragma и #define

Добавлено через 11 минут
и так пробую:

C++
1
2
3
4
5
void __declspec(dllexport) SetCountA(double count){
 
CountA=count;
 
}
Не принимает за допустимое выражение. Компилятор принимает, а программа нет и ошибку там получить невозможно, пишет что не совместима dll c версией программы и все.

Добавлено через 3 минуты
у самой dll экспорт прописан в файлу *.h
C++
1
2
3
4
5
#ifdef WIN32
#define IRTAPI_ENTRY __declspec( dllexport ) int
#else
#define IRTAPI_ENTRY    int
#endif
Добавлено через 2 минуты
у меня 64 разрядная Win7

Добавлено через 14 часов 19 минут
Так и не дает экспорт еще один сделать. Надо наверное как-то по другому доступ получить к обычным функциям, которые с Main конфликтовать не будут.(А Main в этой dll также с экспортом работает, но к программе A). Надо через систему к ним доступ получить. На C++ примеры видел, хотелось бы на C#.

Добавлено через 12 минут
А если использовать не dllexport, а просто extern "C"? Доступ из C# получу?
0
Эксперт Python
 Аватар для dondublon
4653 / 2073 / 366
Регистрация: 17.03.2012
Сообщений: 10,184
Записей в блоге: 6
30.11.2012, 14:33
экспортируйте функции, как обычно. должно работать. если нет, я - пас.
Я проворачивал аналогичную фишку с delphi.
0
1 / 1 / 4
Регистрация: 20.10.2012
Сообщений: 130
30.11.2012, 14:53  [ТС]
Вот войти бы в dll через точку входа основную Main и вызвать другую функцию. Такое возможно? Просто пока сделать функцию с dllexport не получается, и проблема не в ошибки при компиляции, а в программе А которая просто dll не принимает такой. Вопрос разработчику задал, но они не охотно отвечают.

Добавлено через 8 минут
Пишет, что память защищенная и не дает мне писать данные туда.

Добавлено через 43 секунды
Хотя я вроде ничего не писал, а вызвал функцию.
0
Эксперт Python
 Аватар для dondublon
4653 / 2073 / 366
Регистрация: 17.03.2012
Сообщений: 10,184
Записей в блоге: 6
30.11.2012, 14:57
Функция Main не нужна.
Сейчас попробую сам написать такое (возьму из хелпа), о результате отпишусь.

Добавлено через 2 минуты
да, кстати, в качестве проверки, что dll действительно экспортирует функции - рекомендую dll export viewer от nirsoft.
0
1 / 1 / 4
Регистрация: 20.10.2012
Сообщений: 130
30.11.2012, 15:08  [ТС]
Стороннюю API как-то давно получалось подцепить, но она в cpp dllexport не прописывало и функции все вынесены, только:
C++
1
2
3
#include "trans2quik_api.h"
#pragma comment(lib,"TRANS2QUIK.lib")
 extern "C" void __stdcall TRANS2QUIK_TransactionsReplyCallback ();
в своем файле trans2quik_api.h реализован был весь экспорт:
C++
1
2
3
4
5
6
7
8
#pragma once
 
#ifdef TRANS2QUIK_EXPORTS
#define TRANS2QUIK_API __declspec (dllexport)
#pragma message ("TRANS2QUIK_API defined as __declspec (dllexport)")
#else
#define TRANS2QUIK_API __declspec (dllimport)
#endif
Сколько не пытался, повторить это решение не смог.
0
Эксперт Python
 Аватар для dondublon
4653 / 2073 / 366
Регистрация: 17.03.2012
Сообщений: 10,184
Записей в блоге: 6
30.11.2012, 15:27
Сейчас перепроверил с либой на delphi - работает на ура.
На visual c++ - не может найти функцию. Возможно, это связано с тем, что название функции как-то не так экспортируется (судя по отчету dll export viewer), но как это настраивается - не нашел.
0
1 / 1 / 4
Регистрация: 20.10.2012
Сообщений: 130
30.11.2012, 15:32  [ТС]
На 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
 void main()
{
   HINSTANCE hLib=LoadLibrary("DLLTEST.DLL");
    if(hLib==NULL)
    {
       cout << "Unable to load library!" << endl;
       getch();
       return;
    }
 
   char mod[MAXMODULE];
 
   GetModuleFileName((HMODULE)hLib, (LPTSTR)mod, MAXMODULE);
   cout << "Library loaded: " << mod << endl;
   NumberList=(cfunc)GetProcAddress((HMODULE)hLib, "NumberList");
   LetterList=(cfunc)GetProcAddress((HMODULE)hLib, "LetterList");
    if((NumberList==NULL) || (LetterList==NULL))
    {
       cout << "Unable to load function(s)." << endl;
       FreeLibrary((HMODULE)hLib);
       return;
    }
    NumberList();
    LetterList();
    FreeLibrary((HMODULE)hLib);
    getch();
}
Вот бы на C# такое сделать.
И еще разобраться как использовать.
0
Эксперт Python
 Аватар для dondublon
4653 / 2073 / 366
Регистрация: 17.03.2012
Сообщений: 10,184
Записей в блоге: 6
30.11.2012, 15:41
йоу! нашел.
для правильного описания функций (без описания сигнатуры, ибо с ней не работает) делаем так:
C++
1
extern "C" CDLL_API int fncdll(int arg)
где
C++
1
#define CDLL_API __declspec(dllexport)
возможно, можно как-то сделать, чтобы сигнатура не мешала - по идее, должен быть способ.
0
1 / 1 / 4
Регистрация: 20.10.2012
Сообщений: 130
30.11.2012, 15:54  [ТС]
Как я уже делал:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[mydll.h]
#ifndef _mydll_h
#define _mydll_h
#include <stdio.h>
#include <windows.h>
#ifdef WIN32
#define myDLL_ENTRY __declspec( dllexport ) void 
#else
#define myDLL_ENTRY     void 
#endif
 
 
extern "C" {
#endif
 myDLL_ENTRY  SetCountA(double count);
 
 
#ifdef __cplusplus
}
#endif
 
 
[/mydll.h]
Далее в *.cpp

C++
1
2
3
4
extern "C" myDLL_ENTRY  SetCountA(double count)
{
CountA=count;
}
Не принимает((
Проще напрямую к функции доступ получить, чем бороться с программой которая код ошибки не выдает.
0
Эксперт Python
 Аватар для dondublon
4653 / 2073 / 366
Регистрация: 17.03.2012
Сообщений: 10,184
Записей в блоге: 6
30.11.2012, 16:00
ну я не знаю, у меня работает.
а что происходит при вызове?
0
1 / 1 / 4
Регистрация: 20.10.2012
Сообщений: 130
30.11.2012, 16:05  [ТС]
Программа пишет что dll не соответсвует версии программы. Стоит только в cpp закрыть функцию и сразу dll принимается. Сначало разработчик мне сказал что main должна быть выше других функций, сделал выше и все равно не работает. Похоже 2 точку входа сделать программа не позволит.
Остается в памяти ловить dll, находить адрес функции и запускать.
0
Эксперт Python
 Аватар для dondublon
4653 / 2073 / 366
Регистрация: 17.03.2012
Сообщений: 10,184
Записей в блоге: 6
30.11.2012, 16:06
о, кстати, нюанс.
В C#-ной проге, для импорта нативного кода, сама прога должна иметь ту же разрядность(32\64), что и нативная dll-ка.
Это значит, что в настройках проекта, там, где стоит AnyCPU, если dll-ка не той разрядности, что система, надо поставить конкретный тип проца.
По-русски это значит, что если dll-ка 32-битная, а запускается это все на 64-битной системе, то в настройках проекта надо поставить x86 вместо AnyCPU.
0
1 / 1 / 4
Регистрация: 20.10.2012
Сообщений: 130
30.11.2012, 16:07  [ТС]
по крайней мере в cpp она это не позволит.
там в VS2008 dll, там Win32 пишется. Программа dll в общем принимает, только без функций с dllexport. Обычные функции или функции с extern"C" также принимаются.
0
Эксперт Python
 Аватар для dondublon
4653 / 2073 / 366
Регистрация: 17.03.2012
Сообщений: 10,184
Записей в блоге: 6
30.11.2012, 16:07
Цитата Сообщение от eugene7711 Посмотреть сообщение
Программа пишет что dll не соответсвует версии программы.
чо-то странно. не знаю, в чем дело.
0
1 / 1 / 4
Регистрация: 20.10.2012
Сообщений: 130
30.11.2012, 18:28  [ТС]
Подтвердил производитель, у них рабочий день начался, что еще одна точка входа недопустима.

Добавлено через 25 минут
Вот решение для получения данных из dll:

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
43
44
45
46
47
48
49
50
51
52
53
    using System;
    using System.Windows.Forms;
    using System.Runtime.InteropServices;//  Это необходимо добавить
     
    namespace LoadingNativeDll
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
     
            private void button1_Click(object sender, EventArgs e)
            {
                //  Открываем DLL, получаем ее Handle
                IntPtr hExe = Imports.LoadLibrary("NativeDLL.dll");
                //  Получаем адрес функции, експортируемой DLL
                IntPtr NativeFunction = Imports.GetProcAddress(hExe, "GetSomeString");
     
                //  Используя маршалинг, приводим неуправляемую функцию к делегату
                NativeInvoker nativeInvoker = Marshal.GetDelegateForFunctionPointer(NativeFunction, typeof(NativeInvoker)) as NativeInvoker;
                //  Получаем значение експортируемой функции, используя объект делегата
                string importedString = nativeInvoker();
     
                //  Освобождаем ресурсы
                Imports.FreeLibrary(hExe);
     
                //  Выводим значение, полученное из DLL
                MessageBox.Show(importedString);
            }
        }
     
        //  Объявляем делегат, к которому будет приводиться нужная неуправляемая функция
        public delegate string NativeInvoker();
     
        /// <summary>
        /// Импорт необходимых функций Windows API
        /// Смотрите также документацию по атрибуту DllImportAttribute
        /// [url]http://msdn.microsoft.com/library/rus/default.asp?url=/library/rus/cpref/html/frlrfsystemruntimeinteropservicesdllimportattributememberstopic.asp[/url]
        /// </summary>
        public class Imports
        {
            [DllImport("kernel32.dll")]
            public static extern IntPtr LoadLibrary(string lpFileName);
     
            [DllImport("kernel32.dll", CharSet = CharSet.Ansi, ExactSpelling = true)]
            public static extern IntPtr GetProcAddress(IntPtr hModule, string procName);
     
            [DllImport("kernel32.dll", SetLastError = true)]
            public static extern bool FreeLibrary(IntPtr hModule);
        }
    }
Нужно сделать просто на вызов функции.

Добавлено через 3 минуты
Чтобы она с нужными аргументами исполнилась.

Добавлено через 11 минут
Есть еще вариант к dll подцепить другую dll, а в ней уже можно иметь функции с точками входа, которые можно вызывать в 1 dll. Это возможно?
0
Эксперт Python
 Аватар для dondublon
4653 / 2073 / 366
Регистрация: 17.03.2012
Сообщений: 10,184
Записей в блоге: 6
30.11.2012, 18:30
вполне.
0
1 / 1 / 4
Регистрация: 20.10.2012
Сообщений: 130
30.11.2012, 18:33  [ТС]
Получается в dll 1 надо вызвать функцию dll2, которая возьмет данные из моей программы через импорт экспорт.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
30.11.2012, 18:33
Помогаю со студенческими работами здесь

Как получить доступ к данным в Grid?
На форме есть Grid, я его заполняю так: mdb = New OleDbConnection mdb.ConnectionString = &quot;Строка соединения с mdb-файлом&quot; ...

Как получить доступ к данным в ArrayList
Имеется код, который сортирует данные из Map по значениям. Map&lt;Integer, Integer&gt; map = new HashMap&lt;&gt;(); List list = new...

Как получить доступ к данным в List<>?
У меня в List&lt;&gt; заносятся данные, к примеру:id-шники, фамилии, имена, отчества студентов. Как мне получить доступ к любой нужной строке...

Как теперь получить доступ к данным из VB6?
Есть файл с данными, набранный в Excel 2000, при помощи VB6 была написана программа, которая производит выборку из этого файла. Есть...

Пытаюсь получить доступ к данным с веб-страницы
Есть формочка, есть поле ввода и кнопка. Нажимаю на кнопку - формируется запрос в виде URL, использующий данные из поля ввода, и...


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

Или воспользуйтесь поиском по форуму:
37
Ответ Создать тему
Новые блоги и статьи
20. Мат мед. Абсентеизм как отдельный тип простоя
anaschu 29.05.2026
Апдейт модели: исправленные баги, абсентеизм и новые механизмы Продолжаю развивать ранее описанную модель рабочего коллектива на AnyLogic. За последние несколько дней был проведён серьёзный. . .
19. здоровье, усталость и психотип работника влияют на производительность предприятия, и наоборот, производительность на здоровье, усталось и психотип
anaschu 28.05.2026
Дискретно-событийная модель рабочего коллектива на AnyLogic: здоровье, выгорание, психотипы и микростимуляция Привет, коллеги. Хочу поделиться итогами нескольких недель работы над симуляционной. . .
"Прокси" для последовательного порта
Eddy_Em 28.05.2026
Эту штуку написал я достаточно давно. Но сейчас вот понадобилось настроить датчик грозы, но при этом не отключать его от "метеодемона". Соответственно, надо запустить этот "прокси": метеодемон будет. . .
Рефакторинг программы уравнивания.
Massaraksh7 26.05.2026
Пример по предыдущей записи в блоге. Но, надо заметить, что, во-первых, там оптимизация не только математики, но и работы с базой данных, и с графами, а во-вторых, это ещё не всё.
Использование TThread в Lazarus для математических вычислений.
Massaraksh7 25.05.2026
Производя рефакторинг своих программ на предмет ускорения их работы, обратил внимание на такой аспект, как сокращение времени матвычислений. Дело в том, что приходится работать с большими матрицами. . .
Модель здравосохранения 18. Чем здоровее работник, тем быстрее выгорает
anaschu 24.05.2026
Имитационная модель корпоративного здравоохранения: что показывает математика Сегодня в модели рабочего коллектива на AnyLogic появились три новые механики — выгорание через накопленную усталость,. . .
Модель здравосохранения 17. Планы на выгорание
anaschu 23.05.2026
Вот конкретная схема реализации: В классе Работник добавить: накопленнаяУсталость — растёт каждый час работы, снижается в перерывы и болезни коэффициентПрезентеизма — снижает продуктивность. . .
Изменение цветов в палитре gif файла aka фавикона
russiannick 23.05.2026
Изменение цветов в палитре gif файла, юзаемого как фавиконка в составе html-файла, помещенная в base64, средствами нативного Java Script, навеянное сном в майский день. Для работы необходим браузер,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru