Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как передать строку из C# в C++ и обратно 
V
    Опции темы
nnm2005
Дата 16.12.2007, 23:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 10.10.2006

Репутация: нет
Всего: нет



Добрый день!

Есть dll-ка на C++, экспортирующая функцию:
Код

extern "C" char* SchoofCount(char *P, char *A, char *B)
{
    char* res;
    MathClass = new mathem();
    res = MathClass->SchoofCount(p,a,b);
    return res;
}

При использовании из C++ через LoadLibrary и GetProcAddress эта функция работает на ура. 
Теперь нужно вызвать эту функцию из C#.
Делаю так:
Код

class Program
    {
        private readonly static string DllPath = @"C:\cpp\release\dll.dll";

        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)] 
        private static string res;

        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
        private static string p;

        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
        private static string a;

        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
        private static string b;

        /*private static string res;*/

        [DllImport("kernel32.dll", SetLastError = true)]
        public static extern IntPtr LoadLibrary(string lpFileName);

        [DllImport("kernel32.dll", SetLastError = true)]
        public static extern IntPtr FreeLibrary(IntPtr library);

        [DllImport(@"C:\cpp\release\dll.dll", PreserveSig = true, CharSet = CharSet.Unicode)]
        public static extern string SchoofCount(string p, string a, string b);

        public static bool DllTest()
        {
            IntPtr lib = LoadLibrary(DllPath); // здесь lib != null
            p = "4051";
            a = "11";
            b = "17";
            res = SchoofCount(p,a,b);
            FreeLibrary(lib);
            return true;
        }

        static void Main(string[] args)
        {
            DllTest();
        }
    }

Проблема в том, что в dll попадает только первые символы от строк, то есть "4","1" и "1". Как передать строки целиком правильно? Очень желательно бы без COM.
PM MAIL   Вверх
stab
Дата 17.12.2007, 07:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 22
Всего: 48



видимо вот так:
Код

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine(SchoofCount("1", "2", "3"));
    }

    [DllImport(@"C:\cpp\release\dll.dll", CharSet = CharSet.Ansi)]
    public static extern string SchoofCount(string p, string a, string b);
}



--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
nnm2005
Дата 17.12.2007, 10:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 10.10.2006

Репутация: нет
Всего: нет



То есть проблема может быть в кодировке строк? Кстати почему в Вашем примере функция вызывается от первых символов строк? Ведь нужно же от полных строк! 
PM MAIL   Вверх
farad
Дата 17.12.2007, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 199
Регистрация: 1.11.2007

Репутация: -1
Всего: 6



Цитата(nnm2005 @  16.12.2007,  23:01 Найти цитируемый пост)
extern "C" char* SchoofCount(char *P, char *A, char *B){    char* res;    MathClass = new mathem();    res = MathClass->SchoofCount(p,a,b);    return res;}
так нельзя делать. Во первых создается объект класса, который не удаляется, во вторых функция возвращает указатель на массив char,который из кода неясно кто создает и кто его будет удалять. все сишные dll-ные функции обычно возвращают строки через буфер, который передается  в параметрах. Вот так бы функция выглядела бы куда приличней:
Код

extern "C" int SchoofCount(const char *P, 
                           const char *A, 
                           const char *B, 
                           char result[], 
                           int result_lenght)
{
    MathClass = new mathem();
    strncpy(result,MathClass->SchoofCount(p,a,b),result_length);
    result[result_length-1]='\0';
    delete MathClass;
    return 0;
}

а вызывать ее так:
Код

[DllImport("MyDll", CharSet = CharSet.None)]
private static extern int SchoofCount(string a,string b, StringBuilder result, int result_length);
public static string SchoofCount(string a,string b)
{
     StringBuilder sb = new StringBuilder(260);
     SchoofCount(a,b, sb, sb.Capacity);
     return sb.ToString();
}


PM MAIL   Вверх
nnm2005
Дата 18.12.2007, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 10.10.2006

Репутация: нет
Всего: нет



farad, огроменное спасибо за помощь!!!! smile 
Ты прямо в точку попал! То, что надо!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0518 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.