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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Xu4xOK
0 / 0 / 0
Регистрация: 23.08.2013
Сообщений: 6
#1

DLL не возвращает строку - C++

23.08.2013, 10:22. Просмотров 380. Ответов 4
Метки нет (Все метки)

Добрый день. Хочу создать DLL для использования в 1с. Пока получается только вернуть число, а нужно вернуть строку. Вызывается метод met4. Код:

ExampleFS.cpp:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// ExampleFS.cpp: реализация CExampleFS
 
#include "stdafx.h"
#include "ExampleFS.h"
 
 
// CExampleFS
 
 
STDMETHODIMP CExampleFS::met4(LONG* in_param, CHAR* out_param)
{
    // TODO: добавьте код реализации
    char *p;
    p = new char[20];
    strcpy(p, "Hello world!");
    *out_param = *p;
    return S_OK;
}
FS2.idl
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
// FS2.idl: источник IDL для FS2
//
 
// Этот файл будет обработан средством MIDL для
// создания библиотеки типов (FS2.tlb) и кода маршалирования.
 
import "oaidl.idl";
import "ocidl.idl";
 
[
    object,
    uuid(90FE3186-0004-432E-B94B-CB0D0C508664),
    dual,
    nonextensible,
    pointer_default(unique)
]
interface IExampleFS : IDispatch{
    [id(2)] HRESULT met4([in] LONG* in_param, [out,retval] CHAR* out_param);
};
[
    uuid(BE3EC460-A48E-4056-9890-532E9BFD4C08),
    version(1.0),
]
library FS2Lib
{
    importlib("stdole2.tlb");
    [
        uuid(0129F321-5A34-4AE4-9448-056D566912A6)      
    ]
    coclass ExampleFS
    {
        [default] interface IExampleFS;
    };
};
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.08.2013, 10:22     DLL не возвращает строку
Посмотрите здесь:

Написать функцию, которая принимает строку звуков, а возвращает звук C++
C++ Функция alltrim удаляет из строки начальные и конечные пробелы и возвращает указатель на преобразованную строку
C++ Функция возвращает строку (или указатель на начало строки)
Функция с указателем и индексом(Удаляет в строке лидирующие пробелы. Возвращает указатель на преобразованную строку.) C++
Как сделать функцию которая получает цифру и возвращает строку? C++
C++ Написать функцию, которая копирует строку на место другого строки и возвращает признак того, что копирование было успешным
Функция получает массив указателей на строки и возвращает строку в динамической памяти, содержащую объединенный текст из входных строк C++
C++ Написать функцию atoi(), которая принимает параметр - строку цифр и возвращает соответствующее ей целое
C++ Функция, получающая подстроку, возвращает испорченный указатель на строку
Функция, которая на вход принимает строку и в качестве результата возвращает ее копию C++
Напишите функцию, которая получает на вход строку цифр, и возвращает соответствующее целочисленное значение C++
После вызова первого пункта меню функция не возвращает введенную строку C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
grizlik78
Эксперт С++
1903 / 1435 / 109
Регистрация: 29.05.2011
Сообщений: 2,989
23.08.2013, 10:30     DLL не возвращает строку #2
C++
1
*out_param = *p;
Здесь первый символ из p копируется по адресу из out_param. Я так понимаю, что хотелось присвоить указателю адрес, но это тоже не сработает.
А нельзя ли выделять память на стороне вызова, а здесь копировать строку прямо в out_param с помощью strcpy? Только тогда размер буфера тоже желательно передавать, чтобы защититься от его переполнения.
Xu4xOK
0 / 0 / 0
Регистрация: 23.08.2013
Сообщений: 6
23.08.2013, 10:43  [ТС]     DLL не возвращает строку #3
Вызывается это из 1С кодом
1C
1
2
3
Компонента = Новый COMОбъект("FS2.FS");
ТекРезультат = Компонента.met4(1);
Сообщить("" + ТекРезультат);
И нужно чтоб в 1С попадала строка
Убежденный
Системный программист
Эксперт С++
15108 / 6803 / 1073
Регистрация: 02.05.2013
Сообщений: 11,118
Завершенные тесты: 1
23.08.2013, 13:21     DLL не возвращает строку #4
Xu4xOK, если вы работаете с COM, то для строк должны использовать
специальный тип BSTR, а не указатель на char или wchar_t. COM-строка, в отличие
от char/wchar_t, хранит к-во символов и может передаваться через границы процессов.

Например, вот описание метода, принимающего BSTR:
Код
interface IMyIface : IDispatch
{
    HRESULT SomeMethod([in] BSTR Data);
};
А вот свойство, возвращающее BSTR:
Код
interface IMyIface : IDispatch
{
    [propget] HRESULT name([out, retval] BSTR *Data);
};
И, соответственно, его реализация:
C++
1
2
3
4
5
HRESULT _stdcall CMyIFace::get_name(BSTR *Data)
{
    *Data = SysAllocString(L"This is a name of object.");
    return S_OK;
}
Xu4xOK
0 / 0 / 0
Регистрация: 23.08.2013
Сообщений: 6
23.08.2013, 17:48  [ТС]     DLL не возвращает строку #5
Спасибо большое! Заработало
Yandex
Объявления
23.08.2013, 17:48     DLL не возвращает строку
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru