ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 24655|回复: 11

[求助] VB编译错误,提示若要在64位系统上使用,请检查并更新Declare语句,然后用...

[复制链接]

TA的精华主题

TA的得分主题

发表于 2017-3-18 14:23 | 显示全部楼层 |阅读模式
        首先谢谢各位大侠~~        各位大侠,有一个模块代码,可实现在图片控件中显示excel表单元格中的网络地址对应的网络图片,在家里的32位excel中可用,到公司的64位系统就报错,提示:若要在64位系统上使用,请检查并更新Declare 语句,然后用 PtrSafe 属性标记它们。
        我查找了站内相关问题, 解决方案是:
        1.API的声明部分修改 参见版主@zhaogang1960 在2楼的回复 http://club.excelhome.net/thread-1097656-1-1.html
        我直接Declare  改成 Declare PtrSafe。
        2.此时出现错误: 类型不匹配
        看答案知道是:调用API的时候定义变量时修改下,但是我不是很懂vb,不知道要修改哪些变量,希望看到的大神帮忙修改下,谢谢!
      
        模块代码如下:


Option Explicit
'内存函数
Private Declare Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, ByVal dwBytes As Long) As Long
Private Declare Function GlobalFree Lib "kernel32" (ByVal hMem As Long) As Long
Private Declare Function GlobalLock Lib "kernel32" (ByVal hMem As Long) As Long
Private Declare Function GlobalUnlock Lib "kernel32" (ByVal hMem As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByVal Destination As Long, ByVal Source As Long, ByVal Length As Long)


'OLE函数
Public Declare Function CLSIDFromString Lib "ole32" (ByVal lpsz As Any, pclsid As Any) As Long
Private Declare Function CreateStreamOnHGlobal Lib "ole32" (ByVal hGlobal As Long, ByVal fDeleteOnRelease As Long, ppstm As Any) As Long
Private Declare Function OleCreatePictureIndirect Lib "olepro32.dll" (PicDesc As PicBmp, RefIID As Any, ByVal fPictureOwnsHandle As Long, IPic As IPicture) As Long
Private Type PicBmp
    Size   As Long
    Type   As Long
    hBmp   As Long
    hPal   As Long
    Reserved   As Long
End Type


'GDIplus函数
Private Declare Function GdiplusStartup Lib "GDIPlus" (token As Long, inputbuf As GdiplusStartupInput, ByVal outputbuf As Long) As Long
Private Declare Function GdiplusShutdown Lib "GDIPlus" (ByVal token As Long) As Long
Private Declare Function GdipDisposeImage Lib "GDIPlus" (ByVal Image As Long) As Long
Private Declare Function GdipLoadImageFromStream Lib "GDIPlus" (ByVal stream As IUnknown, Image As Long) As Long
Private Declare Function GdipCreateHBITMAPFromBitmap Lib "GDIPlus" (ByVal bitmap As Long, hbmReturn As Long, ByVal background As Long) As Long


Private Type GdiplusStartupInput
    GdiplusVersion As Long
    DebugEventCallback As Long
    SuppressBackgroundThread As Long
    SuppressExternalCodecs As Long
End Type


Private Const GMEM_MOVEABLE = &H2


Public Function LoadWebImage(url As String) As StdPicture


    Dim hMem As Long
    Dim nSize As Long
    Dim lpData As Long
    Dim bufferBytes() As Byte
    Dim istm As stdole.IUnknown
    Dim lToken As Long
    Dim lGSI As GdiplusStartupInput
    Dim IID_IDispatch(15) As Byte
    Dim pic As PicBmp
    Dim lImage As Long, hBmp As Long


    Dim httpRequest
    Set httpRequest = CreateObject("WinHttp.WinHttpRequest.5.1")            '创建WinHttpRequest对象
    With httpRequest
        .Open "get", url, False                                             '获取URL内容
        .Send
        If Left(.GetResponseHeader("Content-Type"), 6) = "image/" Then      '如果URL为图片
            nSize = .GetResponseHeader("Content-Length")                    '获取网络图片的字节长度
            ReDim bufferBytes(nSize - 1)
            bufferBytes = .ResponseBody                                     '将图片文件存储到字节数组中
            hMem = GlobalAlloc(GMEM_MOVEABLE, nSize)                        '分配一块全局内存
            lpData = GlobalLock(hMem)                                       '获取内存句柄
            CopyMemory lpData, VarPtr(bufferBytes(0)), nSize                '将图片文件的字节复制到全局内存中


            lGSI.GdiplusVersion = 1
            If GdiplusStartup(lToken, lGSI, 0) = 0 Then                     '初始化GDI+
                If CreateStreamOnHGlobal(hMem, 1, istm) = 0 Then            '从全局内存创建流
                    GdipLoadImageFromStream istm, lImage                    '将流中内容加载为GDI+ Image图形对象
                    GdipCreateHBITMAPFromBitmap lImage, hBmp, &HFFFFFF      '从Image获取Bitmap句柄
                    GdipDisposeImage lImage                                 '释放Image对象


                    '以下代码从Bitmap句柄生成一个StdPicture对象
                    CLSIDFromString StrPtr("{00020400-0000-0000-C000-000000000046}"), IID_IDispatch(0)
                    With pic
                        .Size = Len(pic)
                        .Type = 1
                        .hBmp = hBmp
                        .hPal = 0
                    End With
                    OleCreatePictureIndirect pic, IID_IDispatch(0), 1, LoadWebImage
                End If
                GdiplusShutdown lToken '关闭GDI+
            End If
            GlobalUnlock hMem
            GlobalFree hMem         '释放全局内存
        End If
    End With
End Function



TA的精华主题

TA的得分主题

 楼主| 发表于 2017-3-18 14:26 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
看到相关回答中有2位大神 @liucqa @zhaogang1960,不知道怎么联系二位,希望大侠看到后能帮忙修改下,谢谢~~

TA的精华主题

TA的得分主题

发表于 2017-3-18 17:14 来自手机 | 显示全部楼层
没人给你改,太多了

TA的精华主题

TA的得分主题

发表于 2017-3-18 17:28 来自手机 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
http://club.excelhome.net/forum.php?mod=viewthread&tid=1283982

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-3-21 16:45 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
liucqa 发表于 2017-3-18 17:28
http://club.excelhome.net/forum.php?mod=viewthread&tid=1283982

谢谢大神~~

TA的精华主题

TA的得分主题

发表于 2018-1-25 10:10 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
我也遇到了这个问题,找到一个比较折中的方法:在64位的系统上面,安装32位的office版本,这样不用修改以前的代码,也能运行。

查看excel版本:文件>账户>关于Excel>弹出的窗口就会显示EXCEL是32位的还是64位的

TA的精华主题

TA的得分主题

发表于 2018-7-12 15:13 | 显示全部楼层
请问你的gdiplus 声明搞定了没,vba7 win64我都启动不了
#If VBA7 And Win64 Then
    Public Declare PtrSafe Function GdiplusStartup Lib "gdiplus.dll" (Token As LongPtr, inputbuf As GdiplusStartupInput, Optional ByVal outputbuf As Long = 0) As Long
    Public Declare PtrSafe Sub GdiplusShutdown Lib "gdiplus.dll" (ByVal Token As LongPtr)

TA的精华主题

TA的得分主题

发表于 2018-9-12 03:23 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
我也碰到这样的问题, 把 Declare 改为 Declare PtrSafe 问题便解决了

评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2020-4-27 09:36 | 显示全部楼层
pysamuel 发表于 2018-9-12 03:23
我也碰到这样的问题, 把 Declare 改为 Declare PtrSafe 问题便解决了

我也碰到过,本楼有效

TA的精华主题

TA的得分主题

发表于 2020-9-25 16:59 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
pysamuel 发表于 2018-9-12 03:23
我也碰到这样的问题, 把 Declare 改为 Declare PtrSafe 问题便解决了

太强大了,谢谢
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-17 07:26 , Processed in 0.043390 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表