shinfo

博客讨论了在获取FTP服务器上文件图标的函数使用问题,提到一个函数返回值为0无法正常工作,还介绍了DATA是FTP服务器上文件全名,同时给出了SHGetFileInfo函数按文件类型取图标的示例。

用以下函数不行,返回值为0:
procedure TForm1.ListView1GetImageIndex(Sender: TObject; Item: TListItem);
Const
   Mode = SHGFI_ICON or SHGFI_SYSICONINDEX;
Var
   info : TSHFileInfo;
   P : ^String;
begin
     If Item.ImageIndex = -1 then
        begin
        FillChar(Info,SizeOf(TSHFileInfo),0);
        P := Item.Data;
        SHGetFileInfo(PChar(P^), 0, Info, SizeOf(TSHFileInfo), Mode);
        Item.ImageIndex := Info.iIcon;
        end;
end;
其中DATA是FTP服务器上文件的全名,如: /public_html (文件夹或文件)

 SHGetFileInfo可以按文件类型取图标,如:
     SHFILEINFO sfi;
     HIMAGELIST hil;
    
     ZeroMemory(&sfi,sizeof(sfi));
     hil = SHGetFileInfo(".zip",
     FILE_ATTRIBUTE_NORMAL,
     &sfi,
     sizeof(sfi),
     SHGFI_USEFILEATTRIBUTES|SHGFI_ICON); 
    

static inline int virtio_net_hdr_to_skb(struct sk_buff *skb, const struct virtio_net_hdr *hdr, bool little_endian) { unsigned int gso_type = 0; unsigned int thlen = 0; unsigned int p_off = 0; unsigned int ip_proto; if (hdr->gso_type != VIRTIO_NET_HDR_GSO_NONE) { switch (hdr->gso_type & ~VIRTIO_NET_HDR_GSO_ECN) { case VIRTIO_NET_HDR_GSO_TCPV4: gso_type = SKB_GSO_TCPV4; ip_proto = IPPROTO_TCP; thlen = sizeof(struct tcphdr); break; case VIRTIO_NET_HDR_GSO_TCPV6: gso_type = SKB_GSO_TCPV6; ip_proto = IPPROTO_TCP; thlen = sizeof(struct tcphdr); break; case VIRTIO_NET_HDR_GSO_UDP: gso_type = SKB_GSO_UDP; ip_proto = IPPROTO_UDP; thlen = sizeof(struct udphdr); break; case VIRTIO_NET_HDR_GSO_UDP_L4: gso_type = SKB_GSO_UDP_L4; ip_proto = IPPROTO_UDP; thlen = sizeof(struct udphdr); break; default: return -EINVAL; } if (hdr->gso_type & VIRTIO_NET_HDR_GSO_ECN) gso_type |= SKB_GSO_TCP_ECN; if (hdr->gso_size == 0) return -EINVAL; } skb_reset_mac_header(skb); if (hdr->flags & VIRTIO_NET_HDR_F_NEEDS_CSUM) { u32 start = __virtio16_to_cpu(little_endian, hdr->csum_start); u32 off = __virtio16_to_cpu(little_endian, hdr->csum_offset); u32 needed = start + max_t(u32, thlen, off + sizeof(__sum16)); if (!pskb_may_pull(skb, needed)) return -EINVAL; if (!skb_partial_csum_set(skb, start, off)) return -EINVAL; p_off = skb_transport_offset(skb) + thlen; if (!pskb_may_pull(skb, p_off)) return -EINVAL; } else { /* gso packets without NEEDS_CSUM do not set transport_offset. * probe and drop if does not match one of the above types. */ if (gso_type && skb->network_header) { struct flow_keys_basic keys; if (!skb->protocol) { __be16 protocol = dev_parse_header_protocol(skb); if (!protocol) virtio_net_hdr_set_proto(skb, hdr); else if (!virtio_net_hdr_match_proto(protocol, hdr->gso_type)) return -EINVAL; else skb->protocol = protocol; } retry: if (!skb_flow_dissect_flow_keys_basic(NULL, skb, &keys, NULL, 0, 0, 0, 0)) { /* UFO does not specify ipv4 or 6: try both */ if (gso_type & SKB_GSO_UDP && skb->protocol == htons(ETH_P_IP)) { skb->protocol = htons(ETH_P_IPV6); goto retry; } return -EINVAL; } p_off = keys.control.thoff + thlen; if (!pskb_may_pull(skb, p_off) || keys.basic.ip_proto != ip_proto) return -EINVAL; skb_set_transport_header(skb, keys.control.thoff); } else if (gso_type) { p_off = thlen; if (!pskb_may_pull(skb, p_off)) return -EINVAL; } } if (hdr->gso_type != VIRTIO_NET_HDR_GSO_NONE) { u16 gso_size = __virtio16_to_cpu(little_endian, hdr->gso_size); unsigned int nh_off = p_off; struct skb_shared_info *shinfo = skb_shinfo(skb); switch (gso_type & ~SKB_GSO_TCP_ECN) { case SKB_GSO_UDP: /* UFO may not include transport header in gso_size. */ nh_off -= thlen; break; case SKB_GSO_UDP_L4: if (!(hdr->flags & VIRTIO_NET_HDR_F_NEEDS_CSUM)) return -EINVAL; if (skb->csum_offset != offsetof(struct udphdr, check)) return -EINVAL; if (skb->len - p_off > gso_size * UDP_MAX_SEGMENTS) return -EINVAL; if (gso_type != SKB_GSO_UDP_L4) return -EINVAL; break; case SKB_GSO_TCPV4: case SKB_GSO_TCPV6: if (skb->csum_offset != offsetof(struct tcphdr, check)) return -EINVAL; break; } /* Too small packets are not really GSO ones. */ if (skb->len - nh_off > gso_size) { shinfo->gso_size = gso_size; shinfo->gso_type = gso_type; /* Header must be checked, and gso_segs computed. */ shinfo->gso_type |= SKB_GSO_DODGY; shinfo->gso_segs = 0; } } return 0; }
10-28
package com.company; import com.sun.jna.Library; import com.sun.jna.Native; import com.sun.jna.Pointer; import com.sun.jna.platform.win32.Shell32; import com.sun.jna.platform.win32.ShlObj; import com.sun.jna.platform.win32.WinDef; import com.sun.jna.platform.win32.WinNT; import com.sun.jna.win32.StdCallLibrary; //net.java.dev.jna:jna:5.13.0 //net.java.dev.jna:jna-platform:5.13.0 import javax.swing.*; import java.awt.*; import java.io.File; public class Main { public interface MyShell32 extends StdCallLibrary { MyShell32 INSTANCE = (MyShell32) Native.load("shell32", MyShell32.class); int SHGetFileInfo(String pszPath, WinNT.DWORD dwFileAttributes, ShlObj.SHFILEINFO psfi, int cbFileInfo, int uFlags); } public static ImageIcon getFileIcon(File file) { ShlObj.SHFILEINFO shinfo = new ShlObj.SHFILEINFO(); int flags = ShlObj.SHGFI_ICON | ShlObj.SHGFI_SMALLICON; MyShell32.INSTANCE.SHGetFileInfo(file.getAbsolutePath(), 0, shinfo, shinfo.size(), flags); Pointer hIcon = shinfo.hIcon; ImageIcon icon = new ImageIcon(Toolkit.getDefaultToolkit().getImage(hIcon.getPointer())); Shell32.INSTANCE.DestroyIcon(hIcon); return icon; } public static void main(String[] args) { File file = new File("src/com/company/Main.java"); ImageIcon icon = getFileIcon(file); JLabel label = new JLabel(icon); JFrame frame = new JFrame(); frame.setLayout(new FlowLayout()); frame.add(label); frame.setSize(300, 300); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } } 这段代码有哪些错误?
最新发布
11-14
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值