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

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

Восстановить пароль Регистрация
 
Xu4xOK
0 / 0 / 0
Регистрация: 23.08.2013
Сообщений: 6
23.08.2013, 10:22     DLL не возвращает строку #1
Добрый день. Хочу создать 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++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
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С попадала строка
Убежденный
Системный программист
 Аватар для Убежденный
14180 / 6195 / 984
Регистрация: 02.05.2013
Сообщений: 10,311
Завершенные тесты: 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 не возвращает строку
Ответ Создать тему
Опции темы

Текущее время: 15:44. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru