Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Delphi, C++] Интерфейс функций C++ в Delphi 
:(
    Опции темы
ivan219
  Дата 21.9.2006, 20:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Вот код на С++
Код

#include <windows.h>
#include "Dshow.h"
#include "qedit.h"
#include <initguid.h>

#include "B2C2_Defs.h"
#include "B2C2_Guids.h"
#include "IB2C2MPEG2DataCtrl.h"
#include "IB2C2MPEG2TunerCtrl.h"

#include "streamreader.h"

#define Z(a) memset(&a, 0, sizeof(a));

#define ERR {log("ERROR_%d", __LINE__);}
#define ERR_R {ERR; return;}
#define ERR_R0 {ERR; return 0;}

char log_file[MAX_PATH];

void log(const char* format, ...)
{    SYSTEMTIME t;
    GetLocalTime(&t);
    char s[1000];
    int l = wsprintf(s, "%.2d:%.2d:%.2d ", t.wHour, t.wMinute, t.wSecond);

    va_list arg_ptr;
    va_start(arg_ptr, format);
    l += wvsprintf(s+l, format, arg_ptr);
    va_end(arg_ptr);

    l += wsprintf(s+l, "\r\n");

    HANDLE h = CreateFile(log_file, GENERIC_WRITE, 0, 0, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
    SetFilePointer(h, 0, 0, FILE_END);
    DWORD w;
    WriteFile(h, s, l, &w, 0);
    CloseHandle(h);
}

#define MPID 0x1fff
#define MCB  4

DWORD id = 1;

struct FLT
{    void* lpFunc[MCB];
    DWORD id[MCB];
    DWORD CallBackType[MCB];
};

FLT flt[MPID];


typedef void (__cdecl  *CDECL_DVBCALLBACK__)(BYTE*,int);

inline void data_send(void* lpFunc, int CallBackType, BYTE* d, int d_l)
{    switch(CallBackType)
    {    case 1:
            ((FASTCALL_DVBCALLBACK)lpFunc)(d, d_l);
            break;
        case 2:
            ((STDCALL_DVBCALLBACK)lpFunc)(d, d_l);
            break;
        case 4:
            ((CDECL_DVBCALLBACK__)lpFunc)(d, d_l);
            break;
        default:
            ERR_R;
    }
}

inline void data(BYTE* d, int d_l)
{    for(;;)
    {    if(d_l == 0) return;
        if(d_l < 0xBC) ERR_R;
        WORD pid = (d[1]<<8|d[2]) & 0x1fff;
        FLT* f = &flt[pid];
        for(int i = 0; i < MCB; i++)
        {    if(f->lpFunc[i])
            {    data_send(f->lpFunc[i], f->CallBackType[i], d, 0xBC);
            }
        }
        d += 0xBC; d_l -= 0xBC;
    }
}

class CSampleGrabberCB : public ISampleGrabberCB
{
public:
    STDMETHODIMP_(ULONG) AddRef() { return 2; }
    STDMETHODIMP_(ULONG) Release() { return 1; }

    STDMETHODIMP QueryInterface(REFIID riid, void ** ppv)
    {    if(riid == IID_ISampleGrabberCB || riid == IID_IUnknown)
        {    *ppv = (void *) static_cast<ISampleGrabberCB*> (this);
            return NOERROR;
        }
        return E_NOINTERFACE;
    }

    STDMETHODIMP SampleCB(double t, IMediaSample * s)
    {    BYTE* buf = NULL;
        s->GetPointer(&buf);
        if(!buf) return 0;
        data(buf, s->GetActualDataLength());
        return 0;
    }

    STDMETHODIMP BufferCB(double t, BYTE * buf, long len)
    {    return 0;
    }
};



STREAMREADER_API BOOL CheckForDVB()
{    log("CheckForDVB()");
    return true;
}

IGraphBuilder*        fg = NULL;
IBaseFilter*           g = NULL;
ISampleGrabber*       sg = NULL;
IBaseFilter*         m2f = NULL;
IB2C2MPEG2DataCtrl3*  dc = NULL;
IB2C2MPEG2TunerCtrl2* tc = NULL;
IMediaControl*        mc = NULL;

CSampleGrabberCB CB;

int pin = 0;

STREAMREADER_API BOOL StartDVB()
{    log("StartDVB()");

    HRESULT r;

#define T if(r) ERR

    r = CoInitialize(NULL);
    T;

    r = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC,
        IID_IGraphBuilder,(void**) &fg);
    T;

    r = CoCreateInstance(CLSID_SampleGrabber, NULL, CLSCTX_INPROC,
        IID_IBaseFilter,(void**) &g);
    T;

    r = fg->AddFilter(g, L"G");
    T;

    r = g->QueryInterface(IID_ISampleGrabber, (void**)&sg);
    T;

    r = sg->SetOneShot(FALSE);
    T;
    r = sg->SetBufferSamples(FALSE);
    T;

    r = sg->SetCallback(&CB, 0);
    T;


    IPin* g_i = NULL;
    r = g->FindPin(L"In", &g_i);
    T;

    r = CoCreateInstance(CLSID_B2C2MPEG2Filter, NULL, CLSCTX_INPROC,
        IID_IBaseFilter,(void **)&m2f);
    T;

    r = fg->AddFilter(m2f, NULL);
    T;

    r = m2f->QueryInterface(IID_IB2C2MPEG2DataCtrl3,(VOID **)&dc);
    T;

    r = m2f->QueryInterface(IID_IB2C2MPEG2TunerCtrl2,(VOID **)&tc);
    T;

    r = tc->Initialize();
    T;

    r = tc->CheckLock();
    T;

    long mpc;
    r = dc->GetMaxPIDCount(&mpc);
    T;

    IPin* out = NULL;

    IEnumPins* e;
    r = m2f->EnumPins(&e);
    T;

    while(e->Next(1, &out, NULL) == S_OK)
    {    
        PIN_INFO pi;
        r = out->QueryPinInfo(&pi);

        if(pi.pFilter != NULL) pi.pFilter->Release();

        if(FAILED(r)) continue;

        if(pi.dir != PINDIR_OUTPUT) continue;

        char pn[128];
        wcstombs(pn, pi.achName, sizeof(pn));

        for(pin = 0; pin < 4; pin++)
        {    char rn[128];
            wsprintf(rn, "Data %d", pin);

            if(strstr(pn, rn)) break;
        }
    }
    e->Release();


    r = fg->ConnectDirect(out, g_i, NULL);
    T;


    r = fg->QueryInterface(IID_IMediaControl,(void **)&mc);
    T;

    r = mc->Run();
    T;

    return true;
}

STREAMREADER_API BOOL StopDVB()
{    log("StopDVB()");

    HRESULT r = mc->Stop();
    T;

    CoUninitialize();

    return true;
}

STREAMREADER_API BOOL SendDiSEqC(DWORD DiSEqCType,BYTE data)
{    log("SendDiSEqC not supported");
    return true;
}

STREAMREADER_API BOOL SetChannel(DWORD freq, DWORD smyb, DWORD pol, DWORD fec, DWORD lof1, DWORD lof2, DWORD lofsw)
{    log("SetChannel(%d, %d, %d, %d, %d, %d, %d)", freq, smyb, pol, fec, lof1, lof2, lofsw);

    int lof;
    int lnb;
    if(freq < lofsw)
    {    lof = lof1;
        lnb = LNB_SELECTION_0;
    }
    else
    {    lof = lof2;
        lnb = LNB_SELECTION_22;
    }

    HRESULT r;
    r = tc->SetFrequencyKHz(freq);
    T;
    r = tc->SetSymbolRate(smyb/1000);
    T;
    r = tc->SetLnbFrequency(lof/1000);
    T;
    r = tc->SetFec(FEC_AUTO);
    T;
    r = tc->SetPolarity(pol);
    T;
    r = tc->SetLnbKHz(lnb);
    T;
    r = tc->SetDiseqc(DISEQC_NONE);
    T;
    r = tc->SetTunerStatus();
    T;

    r = tc->CheckLock();
    T;

    return true;
}

STREAMREADER_API BOOL SetFilter(WORD pid,void* lpFunc, DWORD CallBackType, DWORD size, DWORD *lpfilter_num)
{
    long p = pid;
    long p_c = 1;

    log("SetFilter(%d, 0x%08X, %d, %d, 0x%08X)", pid, lpFunc, CallBackType, size, lpfilter_num);
    for(int i = 0; i < MCB; i++)
    {    if(!flt[pid].lpFunc[i])
        {
            flt[pid].lpFunc[i] = lpFunc;
            flt[pid].CallBackType[i] = CallBackType;
            flt[pid].id[i] = id;
            if(lpfilter_num) *lpfilter_num = id;
            log("filter_num=%d", id);
            id++;

            HRESULT r = dc->AddPIDsToPin(&p_c, &p, pin);
            T;

            return true;
        }
    }
    ERR_R0;
}

STREAMREADER_API BOOL SetFilterEx(WORD pid,void* lpFunc, DWORD CallBackType, DWORD size, DWORD *lpfilter_num)
{    log("SetFilterEx not supported");
    ERR_R0;
}

STREAMREADER_API BOOL SetBitFilter(WORD pid,
    BYTE* FilterData, BYTE* FilterMask, BYTE FilterLength,
    STDCALL_DVBCALLBACK lpFunc, DWORD *lpfilter_num)
{    log("SetBitFilter not supported");
    ERR_R0;
}

STREAMREADER_API BOOL SetRemoteControl(DWORD IR_Type,WORD DevAddr, STDCALL_DVBCALLBACK lpFunc,DWORD * lpfilter_num)
{    log("SetRemoteControl not supported");
    ERR_R0;
}

STREAMREADER_API BOOL DelFilter(DWORD filter_num)
{    log("DelFilter(%d)", filter_num);
    for(int i = 0; i < MPID; i++)
    {    
        for(int j = 0; j < MCB; j++)
        if(flt[i].id[j] == filter_num)
        {    
            flt[i].lpFunc[j] = 0;
            for(int j = 0; j < MCB; j++)
            {    if(flt[i].lpFunc[j]) break;
            }
            if(j >= MCB)
            {    long p = i;
                long p_c = 1;

                HRESULT r = dc->DeletePIDsFromPin(p_c, &p, pin);
                T;
            }
            return true;
        }
    }
    return false;
}

STREAMREADER_API DWORD GetBufSize(DWORD filter_num)
{    return 0;
}

STREAMREADER_API DWORD GetBufUse(DWORD filter_num)
{    return 0;
}

STREAMREADER_API DWORD GetSignalStrength()
{    return 0;
}

BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{    if(ul_reason_for_call == DLL_PROCESS_ATTACH)
    {    GetCurrentDirectory(sizeof(log_file), log_file);
        lstrcat(log_file, "\\streamreader.log");
        log("DLL_PROCESS_ATTACH hModule = %08X", hModule);
    }
    else if (ul_reason_for_call == DLL_PROCESS_DETACH)
    {    log("DLL_PROCESS_DETACH hModule = %08X", hModule);
    }
    return TRUE;
}



Помогите определить функйии.

Т.е. что за что отвечает ну или как аналог на Delphi
PM MAIL ICQ   Вверх
ivan219
Дата 25.9.2006, 08:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Может я что сложное попросил может меня просто не так поняли smile 

Мне ненадо переводить код с С++ на Delphi мне надо просто перевести функции т.е. сами названия функций с С++ на Delphi т.е. как они выгледят в Delphi smile  их вызыват надо с какими пораметрами типами и.т.д  smile 
PM MAIL ICQ   Вверх
Romikgy
Дата 25.9.2006, 08:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

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



Я ниче не понял smile скажи конкретно что нужно ? перевести весь код на дельфи? тогда те в центр помощи или что другое ?


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
dumb
Дата 25.9.2006, 09:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


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

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



не в обиду, но ответ на этот вопрос будет похож на попытку объяснить пятилетнему ребенку, что такое корпускулярно-волновой дуализм. если хочешь пользоваться готовым кодом без его понимания, ищи реализацию на нужном тебе языке.
PM MAIL   Вверх
Alexeis
Дата 25.9.2006, 09:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Цитата(Romikgy @  25.9.2006,  08:56 Найти цитируемый пост)
Я ниче не понял 

Нужно описать делфийские прототипы функций по сишным используя тот же набор передоваемых параметров.
Я правельно понял?


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
dumb
Дата 25.9.2006, 10:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


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

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



ой, а я тоже неправильно понял. пардон. smile
ivan219 просто хочет использовать готовую библиотеку...
PM MAIL   Вверх
dumb
Дата 25.9.2006, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


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

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



наверное как-то так:
Код

const
  DVBdll = 'бла-бла-бла.dll';

function CheckForDVB: Boolean; external DVBdll name 'CheckForDVB'; stdcall;
function StartDVB: Boolean; external DVBdll name 'StartDVB'; stdcall;
function StopDVB: Boolean; external DVBdll name 'StopDVB'; stdcall;
function SetChannel(freq, smyb, pol, fec, lof1, lof2, lofsw: Dword): Boolean; external DVBdll name 'SetChannel'; stdcall;
function SetFilter(pid: WORD; lpFunc: Pointer; CallBackType, size: DWORD; var lpfilter_num: DWORD): Boolean; external DVBdll name 'SetFilter'; stdcall;
function DelFilter(filter_num: DWORD): Boolean; external DVBdll name 'DelFilter'; stdcall;
function GetBufSize(filter_num: DWORD): DWORD; external DVBdll name 'GetBufSize'; stdcall;
function GetBufUse(filter_num: DWORD): DWORD; external DVBdll name 'GetBufUse'; stdcall;
function GetSignalStrength: DWORD; external DVBdll name 'GetSignalStrength'; stdcall;

PM MAIL   Вверх
ivan219
  Дата 25.9.2006, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Да уменя есть готовая библиотека и исходники кней но я незнаю какие функции и с какими пораметрами она экспортирует вот и обратился к вам smile 


dumb, попробую разобратся.
А где ты нашол вот это
Код

const
  DVBdll = 'бла-бла-бла.dll';


А так я вобще непонимаю в C симантике и синтаксиса smile 

Это сообщение отредактировал(а) ivan219 - 25.9.2006, 15:16
PM MAIL ICQ   Вверх
Romikgy
Дата 25.9.2006, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

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



Цитата(ivan219 @  25.9.2006,  14:06 Найти цитируемый пост)
А где ты нашол вот это

это название твое dll ки


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

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


Эксперт
***


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

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



А может её кто на Delphi сможет перевести ну так чтоб мне было понятно т.е. ненадо чтоб она компилилась ну если получится полностью перевести былобы здорово smile

Мне надо чтоб хотябы предстовление иметь что к чему smile 
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

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


 




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


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

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