получение данных с буферезированного канала

Есть библиотека crdbapi.dll написанная на с++ (win32)

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

DWORD dbAttrGetStr( HDBOBJ hObj, DWORD attribute, LPSTR buf, DWORD buflen );
    Возвращаемое значение
    0.Длина возвращаемого строкового атрибута или ноль в случае ошибки.
    Параметры
    1.hObj - является дескриптором объекта, возвращаемым любой из функций dbObject.
    2.attribute - это номер атрибута типа строки или буфера для этого объекта.
    3.buf - адрес символьного буфера, который получает значение атрибута или ноль, чтобы
    получить только требуемый размер буфера.
    4.buflen - указывает размер buf. Любой завершающий символ NULL должен быть включен в
    размер.

Пример с документации

long one = 1;       // the value to find
char buf [128];     // buffer to receive name

// login through running console
hsess = dbSessLoginConsole ( 0,0,0 );

// attach to map class
hClass = dbClassAttach ( hSess, DB_CLASS_MAP );

// lock map class for read and load the selected object
if (dbClassLock ( hClass, DB_LOCK_READ)) {
    obj = dbObjectLoad ( hClass, 12456);
    while ( obj ) {
        dbAttrGetStr ( obj, ATTR_OBJ_NAME, buf, sizeof(buf));
        printf ( “selected object is: %s\n”, buf );
    }
    dbClassUnlock ( hClass, DB_LOCK_READ );
}
dbSessLogout ( hSess );

Попытка реализации на GO, не удается получить значение value

    var mod = syscall.NewLazyDLL("crdbapi.dll")
    var (
        dbObjectLoad       = mod.NewProc("dbObjectLoad")
        dbAttrGetStr       = mod.NewProc("dbAttrGetStr")
    )

    hObj, _, _    := dbObjectLoad.Call(hClass, 36245)
    fmt.Println(hObj)
  
    var value string
    name, _, _   := dbAttrGetStr.Call(hObj, 13, uintptr(unsafe.Pointer(&value)), 10240)
    fmt.Printf("%v name \n", name) //0
    fmt.Printf("%v name \n", *value) //" "

Также вопрос верно ли я указываю значение атрибута ATTR_OBJ_NAME в заголовочном файле crdbapi.h указано

#define _T_STR          3   // string (byte array)
#define DB_MKATTR(ent, oclass, type, num) \
(ent<<DB_ENTSHIFT | type<<DB_TYPESHIFT | oclass<<DB_CLASSSHIFT| num<<DB_NUMSHIFT)
#define CRC_ATTR(objclass, type, num)   DB_MKATTR(56, objclass, type, num)
#define ATTR_OBJ_NAME       CRC_ATTR(0, _T_STR, 2)

Ответы (0 шт):