无法使拾色器在Excel 2010 64位中工作

问题描述 投票:0回答:2

您好我正在努力为Excel 2010 64位更新VBA代码。我已经检查了所有,包括在StackOverflow上的信息性帖子:StackOverflow Question我明白我必须声明PtrSafe并在适用的地方创建LongPtr和LongLong,但我得到“编译错误。类型不匹配”的“.rgbResult”部分私人功能代码。任何和所有的帮助将不胜感激。我的代码如下:

Option Explicit
#If VBA7 Then
     #If Win64 Then
        Private Declare PtrSafe Function ChooseColor Lib "comdlg32.dll" Alias "ChooseColorA" (pChoosecolor As ChooseColor) As LongPtr
        Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
        Private Type ChooseColor
            lStructSize As LongPtr
            hwndOwner As LongPtr
            hInstance As LongPtr
            rgbResult As LongPtr
            lpCustColors As String
            flags As LongPtr
            lCustData As LongPtr
            lpfnHook As LongPtr
            lpTemplateName As String
            End Type
      #Else
       '{{{This Section of Code works ok so i have excluded it to save space as its the same as above without the ptr}}}}}
      #End If
#Else
        '{{{This Section of Code works ok so i have excluded it to save space}}}}}
#End If


#If VBA7 Then
     #If Win64 Then
            Private Declare PtrSafe Function ShowColor Lib "comdlg32.dll" Alias "ShowColorA" (pShowColor As ShowColor) As LongPtr
                Dim ChooseColorStructure As ChooseColor
                Dim Custcolor(16) As LongPtr
                Dim lReturn As LongPtr

                                        On Error GoTo ErrEnd:
                ChooseColorStructure.lStructSize = LenB(ChooseColorStructure)
                ChooseColorStructure.hwndOwner = FindWindow("XLMAIN", Application.Caption)
                ChooseColorStructure.hInstance = 0
                ChooseColorStructure.lpCustColors = StrConv(Custcolor(16), vbUnicode)
                ChooseColorStructure.flags = 0
                If ChooseColor(ChooseColorStructure) <> 0 Then
                    ShowColor = ChooseColorStructure.rgbResult

                    Custcolor(16) = StrConv(ChooseColorStructure.lpCustColors, vbFromUnicode)
                    On Error GoTo 0
                Else
                    ShowColor = -1
                End If
ErrEnd:
         End Function
    #Else
           '{{{This Section of Code works ok so i have excluded it to save space}}}}}
         #End If
#Else
             '{{{This Section of Code works ok so i have excluded it to save space}}}}}

            End Function
excel vba excel-vba 64bit color-picker
2个回答
1
投票
   lStructSize As LongPtr

你要过分声明成员LongPtr而不是Long。仅当成员是指针或句柄类型时才应使用LongPtr,lStructSize不是指针。其他几个成员也是如此,包括rgbResult。它需要看起来像这样:

    Private Type ChooseColor
        lStructSize As Long
        hwndOwner As LongPtr
        hInstance As LongPtr
        rgbResult As Long
        lpCustColors As LongPtr
        flags As Long
        lCustData As LongPtr
        lpfnHook As LongPtr
        lpTemplateName As String
    End Type

2
投票

在搜索了一些之后,我很确定ChooseColor实际上应该是as Long而不是as LongPtr

我做了一个谷歌搜索引用声明:“Private Declare PtrSafe Function ChooseColor Lib "comdlg32.dll" Alias "ChooseColorA" (pChoosecolor As ChooseColor) As LongPtr

我只得到了2个结果:这个问题,以及其他一些网站上的帖子,但是我读不懂,因为它是法语,我一直想要学习但却没有。

我做了一个搜索:“Private Declare PtrSafe Function ChooseColor Lib "comdlg32.dll" Alias "ChooseColorA" (pChoosecolor As ChooseColor) As Long”,我得到了更多的结果,所以我认为它应该被声明为long而不是longPtr。即使在64中,仍然需要返回long而不是longPtr

编辑

这个页面:http://www.jkp-ads.com/articles/apideclarations.asp?AllComments=True在评论中提到chooseColor函数,并且它们用As Long而不是longPtr声明它。以防万一你想参考:)

© www.soinside.com 2019 - 2024. All rights reserved.