Гость
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Ошибка CACHE_CONBROKEN в CacheEval при использовании callin из программы на QT. / 7 сообщений из 7, страница 1 из 1
06.07.2015, 23:23
    #39000962
Hisbreht Victor
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка CACHE_CONBROKEN в CacheEval при использовании callin из программы на QT.
Бьюсь уже несколько дней. Понять не могу.
Программа компилируется без проблем.
Вызовы CacheExecute - никаких проблем.
А вот абсолютно любой вызов CacheEval завершается с кодом ошибки -4 (CACHE_CONBROKEN).

Пытался найти десять отличий (в части, относящейся к callin) от работающего кода, созданного под MSVS 2008. Не нашел.

Сасhe 2009 64 бит, QT 5.4.2 Mingw 5.1 64 бит (сборка отсюда http://sourceforge.net/projects/qt64ng/files/qt/x86-64/5.4.2/mingw-5.1/seh/ )

Собственно вопрос в том, куда можно еще копать? Какие могут быть вообще идеи относительно причин такого поведения.

Виктор
...
Рейтинг: 0 / 0
06.07.2015, 23:45
    #39000969
DAiMor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка CACHE_CONBROKEN в CacheEval при использовании callin из программы на QT.
Hisbreht Victor,

это ссылка на QT, а как же ваш кусок кода, с которым проблемы ?
...
Рейтинг: 0 / 0
07.07.2015, 14:44
    #39001482
servit
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка CACHE_CONBROKEN в CacheEval при использовании callin из программы на QT.
Hisbreht Victor ,

Qt_5_4_2_MINGW_64bit, Caché 2015.2.x64 Unicode - всё работает как надо: и из callin и из callout. Проверяйте свой код.
callin
Код: 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.
#include <stdio.h>
#include <string.h>
#include "callin.h"

int callin();
int dispres();

int main(void)
{
  int	rc;

  CacheSetDir("C:\\InterSystems\\Cache\\Mgr");

  rc = CacheSecureStart(NULL,NULL,NULL,CACHE_TTNONE,10,NULL,NULL);
  if (rc == CACHE_ACCESSDENIED) {
    printf("Access denied");
  }else if (rc == CACHE_SUCCESS){
    callin();
  }else{
    printf("Error (rc = %d)\r\n",rc);
  }
  fflush(stdout);
  CacheEnd();

  return 0;
}

int callin()
{
  CACHE_STR mstr;
  int	rc;

  strcpy((char *)mstr.str,"(1+6)_\" \"_$zd($h)");
  mstr.len = strlen((char *)mstr.str);
  rc = CacheEval(&mstr);
  CacheOflush();
  if (rc == CACHE_SUCCESS) dispres();

  return 0;
}

int dispres()
{
  CACHE_STR	retstr;

  retstr.len = sizeof(retstr.str);
  CacheConvert(CACHE_STRING,(unsigned char *) &retstr);
  printf("Result = %.*s\r\n",retstr.len,retstr.str);
  fflush(stdout);
  return 0;
}

Результат:

Код: plaintext
1.
>test.exe
Result = 7 07.07.2015
ДокументацияYou must call CacheEnd even if the connection was broken. The connection can be broken by a call to CacheAbort with the RESJOB parameter.

CacheEnd performs cleanup operations which are necessary to prepare for another call to CacheStart . Calling CacheStart again without calling CacheEnd (assuming a broken connection) will return the code CACHE_CONBROKEN.

источник
...
Рейтинг: 0 / 0
07.07.2015, 23:02
    #39001855
Hisbreht Victor
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка CACHE_CONBROKEN в CacheEval при использовании callin из программы на QT.
Есть dll, которая реализует доступ к cache через callin
Код простой как апельсин
Код: 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.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
#include "usecache.h"
#include "..\\CacheSource\\callin.h"
#include <io.h>
#include <windows.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>

extern "C"{
        extern  char			shdir[256];
}

    int LastErrorNumber;
    CACHE_STR LastError;  
    CACHE_STR LastError2; 
    CACHE_STR LastErrorSrc;  
    int LastErrorOffset;


int	displayerr(
        int code, // код ошибки, возвращенный от Cache
        CACHE_STR *errmsg, 
        CACHE_STR *srcline,
        CACHE_STR *errmsg2,
        int &offset, 
        int &errornum 
        )
{
    int	rc;
    errornum=code;

    if (code==CACHE_SUCCESS) {
        errmsg->len=0;
        errmsg2->len=0;
        srcline->len=0;
        offset=0;
        errmsg->str[0]=0;
        errmsg2->str[0]=0;
        return code;
    }

    errmsg->len = CACHE_MAXSTRLEN;
    if ((rc=CacheErrxlate(code,errmsg)) == CACHE_ERUNKNOWN)
    {
        strcpy((char*)errmsg->str,"Unknown error!");
        errmsg->len=strlen((char*)errmsg->str);
    }

    errmsg2->len = srcline->len = CACHE_MAXSTRLEN;
    if ((rc=CacheError(errmsg2, srcline, &offset)) != CACHE_SUCCESS)
    {
        strcpy((char*)errmsg2->str,"Unknown error!");
        errmsg2->len=strlen((char*)errmsg2->str);
        srcline->len=0;
        offset=0;
    }
    errmsg->str[errmsg->len]=0;
    errmsg2->str[errmsg2->len]=0;

    return code;
}


// запуск терминальной команды CACHE
int	CacheExecuteCommand(const char * command)
{
    CACHE_STR  query;
    int rc=0;

    strcpy((char *)query.str, command);
    query.len = (unsigned short)strlen((char *)query.str);
    rc=CacheExecute(&query);
    if (rc > 0) return rc;

    return CACHE_SUCCESS;
}

int GetCacheDirectory(char *szCacheDir, unsigned long *dwStrLen)
{
    if (*dwStrLen>strlen(shdir))
    {
        strcpy( szCacheDir, shdir );
        return 1;
    }
    else
    {
        return 0;
    }

}

// для dll установить каталог их расположения
void SetCacheMgrDirectory(void)
{
    unsigned long CacheBinDirLen=512;
    char CacheBinDir[512]={0};
    CacheBinDirLen-=5;
    if ( GetCacheDirectory( ( char* ) CacheBinDir, &CacheBinDirLen ) > 0 )
    {
        strcat( ( char* ) CacheBinDir, "\\mgr" );
        CACHESETDIR( CacheBinDir );
    }
}

//---------------------------------------------------------------------------
// для dll установить каталог их расположения
void SetCacheBinDirectory(void)
{
    unsigned long CacheBinDirLen=512;
    char CacheBinDir[512]={0};
    CacheBinDirLen-=5;

    if ( GetCacheDirectory( ( char* ) CacheBinDir, &CacheBinDirLen ) > 0 )
    {
        strcat( ( char* ) CacheBinDir, "\\bin" );
        SetDllDirectoryA( CacheBinDir );
    }
}

extern "C" void __declspec(dllexport) cacheInit(char* CachePath=NULL)
{
    if (!CachePath)
    {
        strcpy(shdir,"c:\\intersystems\\cache");
        while (shdir[strlen(shdir)-1]=='\\')
            shdir[strlen(shdir)-1] = 0;
    }
    CoInitializeEx(0, COINIT_MULTITHREADED);

    SetCacheBinDirectory();

    SetCacheMgrDirectory();

}

extern "C" void __declspec(dllexport) cacheFinish(void)
{
    CoUninitialize();
}


extern "C" int __declspec(dllexport) cacheConnect(void)
{
    int	rc;
    LastErrorNumber=0;
    CACHE_STR pout,pin,pusername,ppassword,pexename;
    int termflag = CACHE_TTNEVER/*CACHE_TTCALLIN*//*CACHE_TTSTART*//*CACHE_TTALL*/;
    int timeout = 15;

    sprintf((char *) pexename.str,"%d", 123456);
    pexename.len = (unsigned short)strlen((char *) pexename.str);

    *(pin.str)	= '\0';
    pin.len		= 0;
    *(pout.str)	= '\0';
    pout.len	= 0;

    strcpy((char *) pusername.str,"_SYSTEM");
    strcpy((char *) ppassword.str,"SYS");
    pusername.len = (unsigned short)strlen((char *) pusername.str);
    ppassword.len = (unsigned short)strlen((char *)ppassword.str);

    rc=CACHESECURESTART(&pusername,&ppassword,&pexename,termflag, timeout, &pin, &pout);

    if (rc!=CACHE_SUCCESS)
    {
        displayerr(
                    rc,
                    LastError,
                    LastErrorSrc,
                    LastError2,
                    LastErrorOffset,
                    LastErrorNumber
                  );
    }
    else
    {
        rc=CacheExecuteCommand("zn \"Localbase\"");
        displayerr(
                    rc,
                    LastError,
                    LastErrorSrc,
                    LastError2,
                    LastErrorOffset,
                    LastErrorNumber
                  );
    }
    return(rc);
}

extern "C" int __declspec(dllexport) cacheDisconnect(void)
{
    CacheEnd();
}

extern "C" int __declspec(dllexport) cacheCall(
           char* DBName,           // имя локальной БД и области к ней
           int &counter  
        )
{
    CACHE_STR  query;
    sprintf((char*)query.str,"zn \"%s\"",DBName);
    int rc=CacheExecuteCommand((char*)query.str);
    // Вот тут имеем в rc CACHE_SUCCESS, все нормально выполнилось.
    if (rc!=CACHE_SUCCESS)
    {
        return(rc);
    }
    strcpy((char *)query.str, "##class(Data.Table).Process()");
    query.len = (unsigned short)strlen((char *)query.str);
    rc=CacheEval(&query);
    // Вот тут имеем в rc CACHE_CONBROKEN
    if (rc != CACHE_SUCCESS)
    {
        displayerr(
                    rc,
                    LastError,
                    LastErrorSrc,
                    LastError2,
                    LastErrorOffset,
                    LastErrorNumber
                  );
        return rc;
    }
    rc=CACHECONVERT(CACHE_INT,&counter);
    if (rc != CACHE_SUCCESS)
    {
        displayerr(
                    rc,
                    LastError,
                    LastErrorSrc,
                    LastError2,
                    LastErrorOffset,
                    LastErrorNumber
                  );
        return rc;
    }
    displayerr(
                CACHE_SUCCESS,
                LastError,
                LastErrorSrc,
                LastError2,
                LastErrorOffset,
                LastErrorNumber
              );
    return CACHE_SUCCESS;
}

Есть использующее данную DLL программа (фрагмент с использованием данной DLL).
Код: plaintext
1.
2.
3.
4.
5.
  cacheInit();
  cacheConnect();
  cacheCall("OneBase",counter);
  cacheDisconnect();
  cacheFinish();

Прохожу в отладчике и на вызове CacheEval получаю CACHE_CONBROKEN. Причем независимо от класса и его метода (пробовал даже пустой, с тупым возвратом числа).
Что характерно, почти такой же код в другом месте (чистая Visual Studio 2008, правда, без dll) работал.
Пробовал с другой сборкой QT (MSVC 2012 64 бит). Картина такая же, как и для mingw.
...
Рейтинг: 0 / 0
08.07.2015, 08:39
    #39001962
Hisbreht Victor
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка CACHE_CONBROKEN в CacheEval при использовании callin из программы на QT.
Прошу прощения, ложная тревога.
Проблема была в том, что zn была на несуществующую область.
Чуть ошибся в написании.
Это приводило к тому, что последующие вызовы команд ничего не делали, хотя функция завершалась с CACHE_SUCCESS., а cacheEval с ошибкой.

Но тогда непонятно, почему ошибочный zn завершался с CACHE_SUCCESS?
Как определить, что zn не прошел?
...
Рейтинг: 0 / 0
08.07.2015, 08:54
    #39001983
servit
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка CACHE_CONBROKEN в CacheEval при использовании callin из программы на QT.
Hisbreht VictorПрошу прощения, ложная тревога.Спасибо. Вы вовремя меня остановили.
Hisbreht VictorНо тогда непонятно, почему ошибочный zn завершался с CACHE_SUCCESS?
Как определить, что zn не прошел?Потому что коды ошибок могут быть и отрицательными.

Вместо
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
// запуск терминальной команды CACHE
int	CacheExecuteCommand(const char * command)
{
    CACHE_STR  query;
    int rc=0;

    strcpy((char *)query.str, command);
    query.len = (unsigned short)strlen((char *)query.str);
    rc=CacheExecute(&query);
    if (rc > 0) return rc;

    return CACHE_SUCCESS;
}

нужно
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
// запуск терминальной команды CACHE
int	CacheExecuteCommand(const char * command)
{
    CACHE_STR  query;

    strcpy((char *)query.str, command);
    query.len = (unsigned short)strlen((char *)query.str);

    return CacheExecute(&query);
}
...
Рейтинг: 0 / 0
08.07.2015, 14:38
    #39002409
Hisbreht Victor
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка CACHE_CONBROKEN в CacheEval при использовании callin из программы на QT.
Где были мои глаза?!!
Да, пора в отпуск.
...
Рейтинг: 0 / 0
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Ошибка CACHE_CONBROKEN в CacheEval при использовании callin из программы на QT. / 7 сообщений из 7, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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