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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вызов функции из DLL 
:(
    Опции темы
mullih
Дата 29.7.2009, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Добрый день

Есть DLL на С++ 

h file
Код

#include <Windows.h>

extern "C" {

__declspec(dllexport) BOOL __cdecl f1(IN DWORD dwNumDevices, OUT LPVOID lpDeviceString, IN DWORD dwOptions);

}


cpp file
Код

#include "test.h"
#include <stdio.h>
#include <string>

BOOL f1(IN DWORD dwNumDevices, OUT LPVOID lpDeviceString, IN DWORD dwOptions)
{
    char* c = new char[128];
    memset(c, 0, 128);
    sprintf(c, "%d - %d", dwNumDevices, dwOptions);

    strcpy((char*)lpDeviceString, c);

    delete c;

    return true;
}


Не получается вытянуть строку

Код

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;

namespace ConsoleApplication1
{
    class Program
    {
        [DllImport(@"D:\Work\CGI\Test\debug\Test.dll", SetLastError = true, CharSet = CharSet.None)]
        private static extern bool f1(int dwNumDevices, out String lpDeviceString, int dwOptions);

        static мoid Main(string[] args)
        {
                String str = new string('\0', 128);
                bool result = f1(0, out str, 0);
            }
        }
    }
}


Подскажите плиз как можно получить строку из функции. Описание функции в ашке нельзя менять

Заранее благодарен

Это сообщение отредактировал(а) mullih - 29.7.2009, 17:11
PM MAIL WWW Skype   Вверх
jonie
Дата 29.7.2009, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

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



Цитата
extern "C" {

__declspec(dllexport) BOOL __cdecl f1(IN DWORD dwNumDevices, OUT LPVOID lpDeviceString, IN DWORD dwOptions);

}

1) выставить [DllImport( блаблабла , CallingConvention=CallingConvention.Cdecl ]
2)узнать во что извратил компилятор С++ имя функции, сделать это можно утилитой DUMPBIN (входит в поставку VS). С ключем /EXPORTS dllfilename.dll запускать. И вписать его в DllImport( блаблабла , EntryPoint="_ f1@12"] виде
3)указать что функция (все в  DllImport) выдает НЕ юникод для указанной строки, и вообще указать размер буфера под приемную строку. http://pinvoke.net/ посмотрите по функциям WinAPI как там сделано, типа lstrcpyn функция.



--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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