Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

DLL компилируется, но не вызывается в приложении C# - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Найти максимальное число из 4-х переменных http://www.cyberforum.ru/cpp-beginners/thread1243147.html
Найти максимальное число из 4-х (возможно разных) переменных
C++ Перевод из String в long long Мне нужна функция для перевода из String в long long.Функция atoi(const char* str) работает только с констатным масивом символов а мне нужен именно string(переменный).Сам C++ учу недавно в паскале с... http://www.cyberforum.ru/cpp-beginners/thread1243139.html
Случайное распределение кораблей по полю в игре "морской бой" C++
Привет всем кто читал мой предыдущий пост про векторы в морском боем, в той же фунции появилась новая проблема :) После починки функции появилась новая проблема - иногда при тестировании возникает...
Числа Фибоначчи - растолковать код C++
Я тут хочу попрактиковаться в С++, а именно на числах Фебиначи. Я нашел хороший код и хочу его модифицировать, но мне нужно чтоб ктото мне объяснил что за что отвечает. Помогите плз. ...
C++ Вычисление суммы http://www.cyberforum.ru/cpp-beginners/thread1243126.html
Нужно написать программу чтобы в итоге она выдавала сумму: 1/1+3/2+5/3+7/4 ..... 99/50. При этом нужно использовать for, while and do_while.
C++ Оптимизация робота Написал вот эту задачу: Робот Имя входного файла: robot.in Имя выходного файла: robot.out Ограничение по времени: 2 секунды Ограничение по памяти: 64 мегабайта В исследовательской лаборатории... подробнее

Показать сообщение отдельно
MrCold
855 / 753 / 71
Регистрация: 11.01.2012
Сообщений: 1,942
16.08.2014, 22:23
да, конечно работать будет

Простенький класс Person
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
#pragma once
#include <Windows.h> 
#include <sstream>
class Person
{
private:
    char internal_code[30];
    int age;
    char name[30];
 
public: 
    void set_internal_code(char * in_code);
    void set_age(int in_age);
    void set_name(char* in_name);
    void print_info();
 
};
 
 
extern "C++" 
{
    __declspec(dllexport) Person* PersonCreate();
 
    __declspec(dllexport) void PersonSetInternalCode(Person* pFoo, char * internal_code);
 
    __declspec(dllexport) void PersonSetAge(Person* pFoo, int age);
 
    __declspec(dllexport) void PersonSetName(Person* pFoo, char * name);
 
    __declspec(dllexport) void PersonPrintInfo(Person* pFoo);
 
    __declspec(dllexport) void PersonDelete(Person* pFoo);
}
Кликните здесь для просмотра всего текста
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
54
55
56
57
58
59
60
61
62
63
#include "header.h"
 
 
void Person::set_internal_code(char * in_code)
{
    strcpy(internal_code, in_code);
}
 
void Person::set_age(int in_age)
{
    age = in_age;
}
 
void Person::set_name(char* in_name)
{
    strcpy(name, in_name);
}
 
void Person::print_info()
{
    std::ostringstream os;
    os << "internal_code : " << internal_code 
       <<  "\nage :        " << age 
       <<  "\nname :       " << name;
    MessageBoxA(NULL,os.str().c_str(),"",NULL);
    
}
 
 
 
 
extern "C++" 
{
    __declspec(dllexport) Person* PersonCreate()
    { 
        return new Person();
    }
 
    __declspec(dllexport) void PersonSetInternalCode(Person* pFoo, char * internal_code)
    { 
        pFoo->set_internal_code(internal_code);
    }
 
    __declspec(dllexport) void PersonSetAge(Person* pFoo, int age)
    { 
        pFoo->set_age(age);
    }
 
    __declspec(dllexport) void PersonSetName(Person* pFoo, char * name)
    {
        pFoo->set_name(name);
    }
 
    __declspec(dllexport) void PersonPrintInfo(Person* pFoo)
    { 
        pFoo->print_info();
    }
 
    __declspec(dllexport) void PersonDelete(Person* pFoo)
    { 
        delete pFoo;
    }
}


Используем на С# .
получили MEssageBox с инфой о персоне
Кликните здесь для просмотра всего текста
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
using System;
using System.Runtime.InteropServices;
 
    class Program
    {
        [DllImport("NativeDll.dll",
            CallingConvention = CallingConvention.Cdecl,
            EntryPoint = "?PersonCreate@@YAPAVPerson@@XZ")]
        static extern IntPtr PersonCreate();
 
        [DllImport("NativeDll.dll",
            CallingConvention = CallingConvention.Cdecl,
            EntryPoint = "?PersonSetInternalCode@@YAXPAVPerson@@PAD@Z")]
        static extern void PersonSetInternalCode(IntPtr pFoo, string internal_code);
 
        [DllImport("NativeDll.dll", 
            CallingConvention = CallingConvention.Cdecl,
            EntryPoint = "?PersonSetAge@@YAXPAVPerson@@H@Z")]
        static extern void PersonSetAge(IntPtr pFoo, int age);
 
        [DllImport("NativeDll.dll",
            CallingConvention = CallingConvention.Cdecl,
            EntryPoint = "?PersonSetName@@YAXPAVPerson@@PAD@Z")]
        static extern void PersonSetName(IntPtr pFoo, string name);
 
        [DllImport("NativeDll.dll",
            CallingConvention = CallingConvention.Cdecl,
            EntryPoint = "?PersonPrintInfo@@YAXPAVPerson@@@Z")]
        static extern void PersonPrintInfo(IntPtr pFoo);
 
        [DllImport("NativeDll.dll",
            CallingConvention = CallingConvention.Cdecl,
            EntryPoint = "?PersonDelete@@YAXPAVPerson@@@Z")]
        static extern void PersonDelete(IntPtr pFoo);
 
        static void Main(string[] args)
        {
            IntPtr person = PersonCreate();
            PersonSetInternalCode(person, "0987345");
            PersonSetAge(person, 30);
            PersonSetName(person, "Migel");
            PersonPrintInfo(person);
            PersonDelete(person);
 
            Console.ReadKey();
        }
}


И все же, останусь при своем мнении. ШАРП не тот язык чтобы работать с адресами,
Хотя нам не мешает сборщик мусора, так адреса получаем из нативных функций,
но я бы приложил усилия что бы пользователь моей библиотеки не имел доступа к указателям.
От класса Crypter у Т.С. избавился бы , методы заменив функциями
Или вообще на ШАРП все переписал бы, как уже говорил.
1
Миниатюры
DLL компилируется, но не вызывается в приложении C#  
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru