Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / FoxPro, Visual FoxPro Новый топик    Ответить
 С++ & _VFP  [new]
Ноль
Guest
Подскажите как из С++ получить указатель на интерфейс OLE сервера _VFP ?
29 апр 04, 15:29    [657472]     Ответить | Цитировать Сообщить модератору
 Re: С++ & _VFP  [new]
Crip
Member

Откуда:
Сообщений: 2490
Как и все остальные com-объекты
#import (тут фокс typelib)
и объявляешь параметр в методе как IDispatch*, а в самом методе делаешь преобразование к _VfpApplicationPtr .
Давно это было, точный код уже потерял.
29 апр 04, 15:41    [657512]     Ответить | Цитировать Сообщить модератору
 Re: С++ & _VFP  [new]
Ноль
Guest
To Crip :
фокс typelib - файл какой ? что-то я всю систему облазил , но ни tlb ни оdl ни нашел, который бы хоть како-то говорил что это фоксовский ?
30 апр 04, 11:12    [658966]     Ответить | Цитировать Сообщить модератору
 Re: С++ & _VFP  [new]
Crip
Member

Откуда:
Сообщений: 2490
Файл?
Да вроде vfpXr.dll
30 апр 04, 11:16    [658986]     Ответить | Цитировать Сообщить модератору
 Re: С++ & _VFP  [new]
Ноль
Guest
Спасибо.
30 апр 04, 11:24    [659025]     Ответить | Цитировать Сообщить модератору
 Re: С++ & _VFP  [new]
Ноль
Guest
То Crip:

Делаю так:
HRESULT hr = OleInitialize(NULL);
CLSID clsid;
wchar_t progid[] = L"VisualFoxPro.Application";
hr = ::CLSIDFromProgID(progid, &clsid);
IDispatch* pIDispatch = NULL;
hr = ::CoCreateInstance(clsid, NULL, LOCALE_USER_DEFAULT,IID_IDispatch, (void**)&pIDispatch);
DISPID dispid;
OLECHAR FAR* name = L"DoCmd";
pIDispatch->GetIDsOfNames(IID_NULL,&name,1,LOCALE_USER_DEFAULT,&dispid); <- Ошибка
Еще до заполнения DISPPARAMS и вызова функции через pIDispatch->Invoke(...)
Все "рушится". Где я накосячил ?
12 май 04, 10:03    [672948]     Ответить | Цитировать Сообщить модератору
 Re: С++ & _VFP  [new]
Crip
Member

Откуда:
Сообщений: 2490
Нафиг вам Dispatch. У меня через него и не получалось. У Фокса есть родные методы Eval и DoCmd
12 май 04, 21:56    [674900]     Ответить | Цитировать Сообщить модератору
 Re: С++ & _VFP  [new]
Crip
Member

Откуда:
Сообщений: 2490
Наверное невнятно ответил. Это принимать параметр (_Vfp) в методе С++ нужно как IDispatch. Всю работу нужно ввести через интерфейс _VfpApplication
12 май 04, 21:59    [674901]     Ответить | Цитировать Сообщить модератору
 Re: С++ & _VFP  [new]
Ноль
Guest
Понял тебя.
Попробую так. Сразу не допетрил.
Странно что не получается работа через pIDispatch->Invoke(...), мучался -мучался, бросил. Решил попробовать через интелектуальные смарт-указатели
Получилось так :
#import "vfr8r.dll" rename_namespace("VFPLib")
void DoVFPFunc ()
{
using namespace 	VFPLib;
VFPLib::ApplicationPtr VFPobj;
VFPobj.CreateInstance(L"VFPobj.Application");
CComBSTR cmdVFP("Допустимая команда VFP");
VFPobj->DoCmd(_bstr_t(cmdVFP)); <- тут ругается,
}
Еще есть пара вопросов, в утилите MS OLE View в качетсве сервера выступает
VFP8.exe и IDL там из него тащит утилита. Ставил в #import его, таже ситуация, ругается, причем ругается на переопределнный опреатор () типа _bstr_t, а без этой обертки команду в метод не протолкнуть.
Как-то же можно это сделать без передачи в качетсве параметра _VFP, а заиметь IDispatch самому и выполнять методы объекта.
13 май 04, 09:55    [675274]     Ответить | Цитировать Сообщить модератору
 Re: С++ & _VFP  [new]
Ноль
Guest
Еще, а если я хочу передать _VFP в FLL, то как его принимать через
ParamBlk FAR *parm ?

Допустим:
void FAR SetVfpPtr(ParamBlk FAR *parm) 
{ 
#define p0 (parm->p[0].val)  
.... <- тут что-то делаем
}
FoxInfo myFoxInfo[] = {
	{"SetVfpPtr"      ,(FPFI)  SetVfpPtr,      1,"I" <- тут какой тип параметра ?       }, 
}
13 май 04, 10:12    [675303]     Ответить | Цитировать Сообщить модератору
 Re: С++ & _VFP  [new]
XAndy
Member

Откуда: Киев
Сообщений: 326
В fll можно передавать тип 'O'

FoxInfo myFoxInfo[] = {
   {"SetVfpPtr",  (FPFI) SetVfpPtr,  1, "O"}
}
13 май 04, 10:32    [675375]     Ответить | Цитировать Сообщить модератору
 Re: С++ & _VFP  [new]
Ноль
Guest
Передать-то можно, только это будет не IDispatch, а объект фокса.
Я тут попробовал, передавать нужно SYS(3095,_vfp) - указатель на IDispatch объекта, а в FLL принимать как Integer. Потом соответственно приводить к (IDispatch *) типу.
IDispatch знаю, но интерфейсов-то я не вижу пока. Как теперь
получить указатель на интерфейс Application(кстати там не только этот интрфейс есть) описанный в IDL фокса ?
Имеется также typelib фокса. Как теперь все это собрать в кучу для получения
указателя на интерфейс , что-то я не догоню.
14 май 04, 07:57    [677614]     Ответить | Цитировать Сообщить модератору
 Re: С++ & _VFP  [new]
Ноль
Guest
С инициализацией и вызовом разобрался. Схема примерно такая:
#include ...
#import "vfp8.exe" rename_namespace("VFPLib")

int _tmain(int argc, _TCHAR* argv[])
    {
           using namespace VFPLib; 
	ApplicationPtr pmyclassvfp;
	CoInitialize(0); 
	pmyclassvfp.CreateInstance(L"VisualFoxPro.Application");
            _bstr_t res;
	CComBSTR VFPCommand("RUN ping www.ru"); // Для примера пропинговать сетку из VFP
	pmyclassvfp->DoCmd(_bstr_t(VFPCommand));
	res = pmyclassvfp->DefaultFilePath;
	pmyclassvfp->Release();
             CoUninitialize(); 
	return 0;
}
Хотелось бы теперь узнать , а если я написал СOM DLL на VFP, как мне выполнить метод OLE Server"a. Методы VisualFoxpro.Allication видны и их можно выполнить. А подход к выполнению
кода СOM DLL VFP такой же ? И кстати, почему-то с
#import "vfp8.exe" rename_namespace("VFPLib") работает, а с
#import "vfp8r.dll" rename_namespace("VFPLib") не работает(что было бы предпочтительней), при попытке указать: using namespace VFPLib; - ругается что такого не обнаружено. Хотя vfp8r.tli и vfp8r.tlh созданы.
25 май 04, 17:19    [699970]     Ответить | Цитировать Сообщить модератору
 Re: С++ & _VFP  [new]
Crip
Member

Откуда:
Сообщений: 2490
вообще-то com dll использует vfp8t.dll
25 май 04, 22:09    [700564]     Ответить | Цитировать Сообщить модератору
 Re: С++ & _VFP  [new]
Ноль
Guest
То Сrip:
Спасибо.
26 май 04, 10:14    [701065]     Ответить | Цитировать Сообщить модератору
Все форумы / FoxPro, Visual FoxPro Ответить