Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.07.2015, 22:58   #1
paulboxer
 
Регистрация: 05.01.2014
Сообщений: 7
Лампочка Как получить с библиотеки DLL структуру?

метод GetProcAddress() позволяет загрузить из библиотеки функцию, но как загрузить структуру?

Код:
#include "stdafx.h"
#include "iostream"
#include <Windows.h>
#include <conio.h>
 
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[])
{
    typedef void(*funcclass)();
    HMODULE hlib = LoadLibrary(TEXT("pocketsphinx.dll"));
    if (hlib == NULL) cout << "lib err";
    else cout << "lib connect";
 
    
    funcclass func = (funcclass)GetProcAddress(hlib, "ps_add_word");
    //if (func != NULL) ps_add_word();
    
    //ps_decoder_t *ps;  //ps_decoder_t - структура но как ею воспользоваться из библиотеки?
        
        FreeLibrary(hlib);
    _getch();
    return 0;
}
paulboxer вне форума Ответить с цитированием
Старый 05.07.2015, 23:00   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Структура это тип. Ее описание врядли будет содержаться в обычной ДЛЛ.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 05.07.2015, 23:12   #3
paulboxer
 
Регистрация: 05.01.2014
Сообщений: 7
По умолчанию

Stilet, спасибо за ответ. Жаль получается придется вносить изменения в исходный код библиотеки.
paulboxer вне форума Ответить с цитированием
Старый 05.07.2015, 23:45   #4
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,372
По умолчанию

Цитата:
Сообщение от paulboxer Посмотреть сообщение
получается придется вносить изменения в исходный код библиотеки.
Зачем!?
Поясните, чего толком добиваетесь?
waleri вне форума Ответить с цитированием
Старый 06.07.2015, 01:52   #5
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
метод GetProcAddress() позволяет загрузить из библиотеки функцию
этот метод просто находит адрес функции (точку входа в функцию с заданным именем) или глобальной переменной и возвращает только указатель или ноль (если не найден). Типы параметров функции, их порядок и количество кодер должен знать заранее, иначе получит разрушение стека и/или AV. Также и со структурой - типы, порядок и кол-во полей надо знать! По-другому - никак.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 06.07.2015, 12:02   #6
paulboxer
 
Регистрация: 05.01.2014
Сообщений: 7
По умолчанию

waleri, я хочу использовать две библиотеки
sphinxbase.dll
pocketsphinx.dll

исходники которых - вот они
https://bitbucket.org/paulboxer/sphinxbase/downloads
https://bitbucket.org/paulboxer/pock...earn/downloads

мне нужно выполнить такой код:
Код:
#include <pocketsphinx.h>
 
int main(int argc, char *argv[])
{
        ps_decoder_t *ps;
        cmd_ln_t *config;
 
        config = cmd_ln_init(NULL, ps_args(), TRUE,
                 "-hmm", MODELDIR "H:/GIT/pocketsphinxlearn/model/en-us/en-us",
                 "-lm", MODELDIR "H:/GIT/pocketsphinxlearn/model/en-us/en-us.lm.dmp",
                 "-dict", MODELDIR "H:/GIT/pocketsphinxlearn/model/en-us/cmudict-en-us.dict",
                 NULL);
        if (config == NULL)
                return 1;
 
        return 0;
}

как это можно сделать?
в pocketsphinx.h в extern "C" { есть описание структуры}, но ее использовать из библиотеки я не могу...
Изображения
Тип файла: png pocketsphinx.h.png (18.4 Кб, 42 просмотров)

Последний раз редактировалось paulboxer; 06.07.2015 в 12:05.
paulboxer вне форума Ответить с цитированием
Старый 06.07.2015, 12:30   #7
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,833
По умолчанию

Цитата:
но ее использовать из библиотеки я не могу...
почему? (10 почемучек)
p51x вне форума Ответить с цитированием
Старый 06.07.2015, 15:20   #8
ResourceSpace
Форумчанин
 
Аватар для ResourceSpace
 
Регистрация: 30.06.2015
Сообщений: 353
По умолчанию

Цитата:
в pocketsphinx.h в extern "C" { есть описание структуры}, но ее использовать из библиотеки я не могу...
В подобных случаях необходимо подключать этот сторонний заголовочник. Ну или просто копировать описание типов данных к себе.
ResourceSpace вне форума Ответить с цитированием
Старый 12.07.2015, 18:12   #9
paulboxer
 
Регистрация: 05.01.2014
Сообщений: 7
По умолчанию

Я уже немного продвинулся в своем вопросе
В общем сейчас пытаюсь вызвать функции DLL библиотек из C#... и передать туда структуры или ссылки на них...

API библиотек:
http://cmusphinx.sourceforge.net/doc...inx/index.html
http://cmusphinx.sourceforge.net/doc...ase/index.html

Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;
 
namespace callsphinx
{    
    class Program
    {
        //ps_decoder_t* ps_init(cmd_ln_t* config)
        [DllImport("pocketsphinx.dll",
            SetLastError = true,
            CallingConvention = CallingConvention.Cdecl)]
        public extern static IntPtr ps_init(
            IntPtr config);
 
        //int ps_decode_raw(ps_decoder_t *ps, FILE *rawfh, char const *uttid, long maxsamps);
        [DllImport("pocketsphinx.dll",
            SetLastError = true,
            CallingConvention = CallingConvention.Cdecl)]
        public extern static int ps_decode_raw(
            IntPtr ps,
            IntPtr rawfh,
            [MarshalAs(UnmanagedType.LPStr)] string uttid,
            int maxsamps);
 
        [DllImport("msvcrt.dll",
            SetLastError = true,
            CallingConvention = CallingConvention.Cdecl)]
        public extern static IntPtr fopen(
            [MarshalAs(UnmanagedType.LPStr)] string _Filename,
            [MarshalAs(UnmanagedType.LPStr)] string _Mode);
 
        //SPHINXBASE_EXPORT cmd_ln_t* cmd_ln_parse_r    (   cmd_ln_t *  inout_cmdln,
        //    arg_t const *     defn, - как эту структуру описать?
        //    int32     argc,
        //    char *    argv[],
        //    int32     strict
        //    )    
        [DllImport("sphinxbase.dll",
            SetLastError = true,
            CallingConvention = CallingConvention.Cdecl)]
        public extern static IntPtr cmd_ln_parse_r(/*Надо придумать как сдесь 5 параметров описать...*/);
 
        static void Main(int argc, string[] args)
        {
            //char *argv[]; - код из "Си"
            IntPtr config = cmd_ln_parse_r(null, cont_args_def, argc, argv, true);            
            IntPtr ps = ps_init(config);
            IntPtr fh = fopen(@"goforward.raw", "rb");
            int rv = ps_decode_raw(ps, fh, "goforward", -1);
        }
    }
}
Описание структуры на Си
Код:
/**
* @struct arg_t
* Argument definition structure.
*/
typedef struct arg_s {
    char const *name;   /**< Name of the command line switch */
    int type;           /**< Type of the argument in question */
    char const *deflt;  /**< Default value (as a character string), or NULL if none */
    char const *doc;    /**< Documentation/description string */
} arg_t;
 
static const arg_t cont_args_def[] = {
    POCKETSPHINX_OPTIONS,
    /* Argument file. */
    {"-argfile",
     ARG_STRING,
     NULL,
     "Argument file giving extra arguments."},
    {"-adcdev",
     ARG_STRING,
     NULL,
     "Name of audio device to use for input."},
    {"-infile",
     ARG_STRING,
     NULL,
     "Audio file to transcribe."},
    {"-inmic",
     ARG_BOOLEAN,
     "no",
     "Transcribe audio from microphone."},
    {"-time",
     ARG_BOOLEAN,
     "no",
     "Print word times in file transcription."},
    CMDLN_EMPTY_OPTION
};
paulboxer вне форума Ответить с цитированием
Старый 12.07.2015, 18:16   #10
paulboxer
 
Регистрация: 05.01.2014
Сообщений: 7
По умолчанию

Цитата:
Сообщение от ResourceSpace Посмотреть сообщение
В подобных случаях необходимо подключать этот сторонний заголовочник. Ну или просто копировать описание типов данных к себе.
не знаю как это сделать, с Си на C#.
paulboxer вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как можно получить структуру TOOLINFO тултипа (Tooltips_class32) Narutо Общие вопросы Delphi 9 30.12.2010 17:24
Как получить базу индексов таблицы экспорта DLL ? Wardrag Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 21.08.2010 21:25
Получить структуру таблицы (MySQL+ZEOS) Greek9000 БД в Delphi 2 13.01.2010 12:07
Как передать какртинку и получить картику из dll?(она не в ресурсах) puga555 Общие вопросы Delphi 7 22.12.2009 16:37
Получить структуру таблиц и запросов ShoGUN Microsoft Office Access 2 06.07.2009 17:01