получение данных с буферезированного канала
Есть библиотека 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)