powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Нифика не пойму в чем трабл в VC++ 6.0 работало на "Ура"
17 сообщений из 17, страница 1 из 1
Нифика не пойму в чем трабл в VC++ 6.0 работало на "Ура"
    #33799922
Alexey-M
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
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.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
#import "vfp9r.dll" rename_namespace("VFPLib2")  
  #define _s(x) CString((x))
  #define _ld(i) LoadReferI(parm->p[(i)].loc);

  extern const IID IID_Application ={0x002D2B12, 0xC1FA, 0x4193,  
  {0xB1, 0x34, 0xD8, 0x6E, 0xAE, 0xCC ,0x52, 0x50}};  // vfp 9.0
 
  ApplicationPtr pVfpTimer; 
  map <UINT,char*> mListTimers; // карта таймеров

  
  int LoadReferI(Locator Loc)
{
	Value Val={ 0 };
	ZeroMemory(&Val, sizeof(Value));
	int iErrCode=  _Load(&Loc, &Val);
	if(Val.ev_type!='I' && iErrCode!= 0 ) return NULL;
	return (Val.ev_long);
}


  void CSetTimer(ParamBlk FAR *parm)
{
long hWnd,nIDTimer,uElapse,IDisp;
hWnd     = _ld( 0 );
nIDTimer = _ld( 1 );
uElapse  = _ld( 2 );
IDisp    = _ld( 3 );

BOOL bRez=TRUE;
CoInitialize(NULL);
IDispatch* _vfpapp = (IDispatch*)IDisp;
ApplicationPtr pVfpTimer  =  _com_ptr_t<ApplicationPtr>(_vfpapp);
if (pVfpTimer!=NULL)
	 bRez = SetTimer((HWND)hWnd,(UINT)nIDTimer,(UINT)uElapse,(TIMERPROC)TimerProc);
else bRez =  FALSE;
   
CoUninitialize();
_RetLogical(bRez); 
}


void CALLBACK  TimerProc(HWND hwnd, UINT msg, UINT idTimer, DWORD dwTime) 
{
CoInitialize(NULL);
char *czObj;
map<UINT,char*>::iterator p=mListTimers.find(idTimer);
if (p!=mListTimers.end()) czObj=p->second;
CString sCmd = _s(czObj)+_s(".")+_s("TimerEvents()");
BSTR _bstr_cmd = sCmd.AllocSysString();
_bstr_t _bstr_do(_bstr_cmd,TRUE);
if(pVfpTimer==NULL) pVfpTimer->DoCmd(_bstr_do);pVfpTimer->DoCmd(_bstr_t("? 'Error'"));
SysFreeString( _bstr_cmd);
CoUninitialize(); 
} 

Вот с какого перепугаp VfpTimer в TimerProc == NULL ?
Мождет маршалить ? Но ! без маршалинга под 6.0 работало и даже не заикалось.
...
Рейтинг: 0 / 0
Нифика не пойму в чем трабл в VC++ 6.0 работало на "Ура"
    #33800437
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
if(pVfpTimer==NULL) pVfpTimer->DoCmd(_bstr_do);pVfpTimer->DoCmd(_bstr_t("? 'Error'"));
по-моему, это не должно работать.
...
Рейтинг: 0 / 0
Нифика не пойму в чем трабл в VC++ 6.0 работало на "Ура"
    #33800451
Alexey-M
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maXmo,"отец", ну ошибся чуток.
Ты ясное дело видишь что не:
if(pVfpTimer==NULL) pVfpTimer->DoCmd(_bstr_do);pVfpTimer->DoCmd(_bstr_t("? 'Error'"));
а:
if(pVfpTimer==NULL)
pVfpTimer->DoCmd(_bstr_do);
else pVfpTimer->DoCmd(_bstr_t("? 'Error'"));

в чем трабл, вот в чем вопрос.
...
Рейтинг: 0 / 0
Нифика не пойму в чем трабл в VC++ 6.0 работало на "Ура"
    #33800454
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
ApplicationPtr pVfpTimer  =  _com_ptr_t<ApplicationPtr>(_vfpapp);
присвоил значение локальной переменной и радуешься?
...
Рейтинг: 0 / 0
Нифика не пойму в чем трабл в VC++ 6.0 работало на "Ура"
    #33800464
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
if(pVfpTimer==NULL)
pVfpTimer->DoCmd(_bstr_do);
else pVfpTimer->DoCmd(_bstr_t("? 'Error'"));
всё равно в случае pVfpTimer==NULL будет Access Violation
...
Рейтинг: 0 / 0
Нифика не пойму в чем трабл в VC++ 6.0 работало на "Ура"
    #33800519
Alexey-M
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Никуя, она у меня
Код: plaintext
 ApplicationPtr pVfpTimer;  
глобально.
> всё равно в случае pVfpTimer==NULL будет Access Violation
Опять никуя. Все работае четко , но не так на надо по логике.
Выполнятся вот это:
Код: plaintext
pVfpTimer->DoCmd(_bstr_t("? 'Error'"));  
Но тут:
Код: plaintext
 ApplicationPtr pVfpTimer  =  _com_ptr_t<ApplicationPtr>(_vfpapp); 
pVfpTimer не NULL 100%.
...
Рейтинг: 0 / 0
Нифика не пойму в чем трабл в VC++ 6.0 работало на "Ура"
    #33800589
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
функции CSetTimer на твою глобальную pVfpTimer куй положить, у ней своя локальная pVfpTimer есть, и она её юзает, значение глобальной не меняется. Это называется "экранирование глобальной переменной".

зы это не код, это АХТУНГ!
...
Рейтинг: 0 / 0
Нифика не пойму в чем трабл в VC++ 6.0 работало на "Ура"
    #33800619
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и всё-таки разберись с этим if-else, очень уж он подозрительно выглядит :)
а вообще спасибо, развеселил
...
Рейтинг: 0 / 0
Нифика не пойму в чем трабл в VC++ 6.0 работало на "Ура"
    #33800633
Alexey-M
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maXmo, да "отец" нормально у меня и с иф и с елзе. Ну бывает, рука дрогнула :)) Косяк-то в чем ?
...
Рейтинг: 0 / 0
Нифика не пойму в чем трабл в VC++ 6.0 работало на "Ура"
    #33800645
Alexey-M
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>зы это не код, это АХТУНГ!
Я тщеславием не страдаю ;)
...
Рейтинг: 0 / 0
Нифика не пойму в чем трабл в VC++ 6.0 работало на "Ура"
    #33800676
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
попробуй вместо
Код: plaintext
ApplicationPtr pVfpTimer  =  _com_ptr_t<ApplicationPtr>(_vfpapp);
написать
Код: plaintext
pVfpTimer  =  _com_ptr_t<ApplicationPtr>(_vfpapp);

проверка:
Код: plaintext
1.
if(pVfpTimer!=NULL)pVfpTimer->DoCmd(_bstr_do);
else pVfpTimer->DoCmd(_bstr_t("? 'Error'")); //я отказываюсь в это верить
...
Рейтинг: 0 / 0
Нифика не пойму в чем трабл в VC++ 6.0 работало на "Ура"
    #33800699
Alexey-M
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maXmo, давай тогда без голословных интелектуальных хамств. Что тебе в коде не нравиться ? И вообще в чем проблема ? Для "особо одаренных" еще раз повторяю. В 6.0 работало на "Ура". В VS 2005 ни ошибок , но и не работает :)
...
Рейтинг: 0 / 0
Нифика не пойму в чем трабл в VC++ 6.0 работало на "Ура"
    #33801165
Alexey-M
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то я ручник включил :)
pVfpTimer = _com_ptr_t<ApplicationPtr>(_vfpapp);
прокатило! (Нафига я ее локальной сделал , загадка )
пасиба!!!
...
Рейтинг: 0 / 0
Нифика не пойму в чем трабл в VC++ 6.0 работало на "Ура"
    #33801290
Alexey-M
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maXmo, пиво куда слать ? Приз за выдержку :)
...
Рейтинг: 0 / 0
Нифика не пойму в чем трабл в VC++ 6.0 работало на "Ура"
    #33801355
Alexey-M
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Заработало! А че трахался-то ? А-то, что штатный таймер Visual Fox Pro копит WM_TIMER в очереди сообщений при условии, что время исполнения кода > времени интервала события. По пьяни они его писали что ли. Балбесы.
...
Рейтинг: 0 / 0
Нифика не пойму в чем трабл в VC++ 6.0 работало на "Ура"
    #33802318
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey-MЧто тебе в коде не нравиться?ну попробуй такой код где-нить выполнить:
Код: plaintext
1.
pVfpTimer=NULL;
pVfpTimer->DoCmd(_bstr_t("? 'Error'"));
нормально работает?
...
Рейтинг: 0 / 0
Нифика не пойму в чем трабл в VC++ 6.0 работало на "Ура"
    #33843756
Alexey-M
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maXmo, спасибо.
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Нифика не пойму в чем трабл в VC++ 6.0 работало на "Ура"
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]