package xianYu import ( "fmt" "os" "path/filepath" "syscall" "unsafe" ) var ( gXianYuDll *XianYuDLL ) // XianYuDLL 闲鱼工具DLL结构 type XianYuDLL struct { Dll *syscall.DLL freeCString *syscall.Proc // 释放C字符串 } // InitXianYuDll 初始化 XianYuDLL func InitXianYuDll(url string) (*XianYuDLL, error) { if gXianYuDll != nil { return gXianYuDll, nil } dllPath := filepath.Join(url, "xy.dll") if _, err := os.Stat(dllPath); os.IsNotExist(err) { return nil, fmt.Errorf("XianYu DLL 不存在: %s", dllPath) } dll, err := syscall.LoadDLL(dllPath) if err != nil { return nil, fmt.Errorf("加载XianYu DLL 失败: %s", err) } gXianYuDll = &XianYuDLL{ Dll: dll, freeCString: dll.MustFindProc("FreeCString"), } return gXianYuDll, nil } // XianYuGoodsAdd 商品新增 func (m *XianYuDLL) XianYuGoodsAdd(bodyJson string, configFile string) (string, error) { proc, err := m.Dll.FindProc("ExecuteGoodsCreat") if err != nil { return "", fmt.Errorf("找不到函数 ExecuteGoodsCreat: %v", err) } bodyJsonPtr, _ := syscall.BytePtrFromString(bodyJson) configFile = configFile + "\\config.ini" configFilePtr, _ := syscall.BytePtrFromString(configFile) resultPtr, _, _ := proc.Call( uintptr(unsafe.Pointer(bodyJsonPtr)), uintptr(unsafe.Pointer(configFilePtr)), ) result := cStr(resultPtr) return result, nil } // XianYuGoodsAddCheckIsbn 商品新增检查ISBN func (m *XianYuDLL) XianYuGoodsAddNew(bodyJson string, configFile string) (string, error) { proc, err := m.Dll.FindProc("ExecuteGoodsCreatNew") if err != nil { return "", fmt.Errorf("找不到函数 ExecuteGoodsCreatNew: %v", err) } bodyJsonPtr, _ := syscall.BytePtrFromString(bodyJson) configFile = configFile + "\\config.ini" configFilePtr, _ := syscall.BytePtrFromString(configFile) resultPtr, _, _ := proc.Call( uintptr(unsafe.Pointer(bodyJsonPtr)), uintptr(unsafe.Pointer(configFilePtr)), ) result := cStr(resultPtr) return result, nil } // XianYuLaunchGoods 商品上架 func (m *XianYuDLL) XianYuLaunchGoods(bodyJson string, configFile string) (string, error) { proc, err := m.Dll.FindProc("ExecuteGoodsPublish") if err != nil { return "", fmt.Errorf("找不到函数 ExecuteGoodsPublish: %v", err) } bodyJsonPtr, _ := syscall.BytePtrFromString(bodyJson) configFile = configFile + "\\config.ini" configFilePtr, _ := syscall.BytePtrFromString(configFile) resultPtr, _, _ := proc.Call( uintptr(unsafe.Pointer(bodyJsonPtr)), uintptr(unsafe.Pointer(configFilePtr)), ) result := cStr(resultPtr) return result, nil } // XianYuGetGoodsList 拉取商品列表 func (m *XianYuDLL) XianYuGetGoodsList(bodyJson string, configFile string) (string, error) { proc, err := m.Dll.FindProc("ExecuteSelectGoodsListPrice") if err != nil { return "", fmt.Errorf("找不到函数 ExecuteSelectGoodsListPrice: %v", err) } bodyJsonPtr, _ := syscall.BytePtrFromString(bodyJson) configFile = configFile + "\\config.ini" configFilePtr, _ := syscall.BytePtrFromString(configFile) resultPtr, _, _ := proc.Call( uintptr(unsafe.Pointer(bodyJsonPtr)), uintptr(unsafe.Pointer(configFilePtr)), ) result := cStr(resultPtr) return result, nil } // XianYuGetGoodsDetail 拉取商品详情 func (m *XianYuDLL) XianYuGetGoodsDetail(bodyJson string, configFile string) (string, error) { proc, err := m.Dll.FindProc("ExecuteGetGoodsDetail") if err != nil { return "", fmt.Errorf("找不到函数 ExecuteGetGoodsDetail: %v", err) } bodyJsonPtr, _ := syscall.BytePtrFromString(bodyJson) configFile = configFile + "\\config.ini" configFilePtr, _ := syscall.BytePtrFromString(configFile) resultPtr, _, _ := proc.Call( uintptr(unsafe.Pointer(bodyJsonPtr)), uintptr(unsafe.Pointer(configFilePtr)), ) result := cStr(resultPtr) return result, nil } // XianYuExecuteGoodsDownShelf 下架商品 func (m *XianYuDLL) XianYuExecuteGoodsDownShelf(bodyJson string, configFile string) (string, error) { proc, err := m.Dll.FindProc("ExecuteGoodsDownShelf") if err != nil { return "", fmt.Errorf("找不到函数 ExecuteGoodsDownShelf: %v", err) } bodyJsonPtr, _ := syscall.BytePtrFromString(bodyJson) configFile = configFile + "\\config.ini" configFilePtr, _ := syscall.BytePtrFromString(configFile) resultPtr, _, _ := proc.Call( uintptr(unsafe.Pointer(bodyJsonPtr)), uintptr(unsafe.Pointer(configFilePtr)), ) result := cStr(resultPtr) return result, nil } // XianYuExecuteGoodsUpdateStock 修改库存 func (m *XianYuDLL) XianYuExecuteGoodsUpdateStock(bodyJson string, configFile string) (string, error) { proc, err := m.Dll.FindProc("ExecuteGoodsEditStock") if err != nil { return "", fmt.Errorf("找不到函数 ExecuteGoodsEditStock: %v", err) } bodyJsonPtr, _ := syscall.BytePtrFromString(bodyJson) configFile = configFile + "\\config.ini" configFilePtr, _ := syscall.BytePtrFromString(configFile) resultPtr, _, _ := proc.Call( uintptr(unsafe.Pointer(bodyJsonPtr)), uintptr(unsafe.Pointer(configFilePtr)), ) result := cStr(resultPtr) return result, nil } // XianYuExecuteGoodsUpdatePrice 修改价格 func (m *XianYuDLL) XianYuExecuteGoodsUpdatePrice(bodyJson string, configFile string) (string, error) { proc, err := m.Dll.FindProc("ExecuteGoodsEditPrice") if err != nil { return "", fmt.Errorf("找不到函数 ExecuteGoodsEditPrice: %v", err) } bodyJsonPtr, _ := syscall.BytePtrFromString(bodyJson) configFile = configFile + "\\config.ini" configFilePtr, _ := syscall.BytePtrFromString(configFile) resultPtr, _, _ := proc.Call( uintptr(unsafe.Pointer(bodyJsonPtr)), uintptr(unsafe.Pointer(configFilePtr)), ) result := cStr(resultPtr) return result, nil } // cStr 将 C 字符串指针转换为 Go 字符串 func cStr(ptr uintptr) string { if ptr == 0 { return "" } var b []byte for { c := *(*byte)(unsafe.Pointer(ptr)) if c == 0 { break } b = append(b, c) ptr++ } return string(b) }