我在编程时调用GdipLoadImageFromFile()时,发现传String和传Byte数组都不能正确调用所有文件.用String:Private Declare Function GdipLoadImageFromFile Lib "gdiplus" (ByVal filename As String,_
                         Image As Long) As GpStatus
调用时:  If GdipLoadImageFromFile(StrConv(ImagePath, vbUnicode), gdip_Image) <> Ok Then  .....
检查发现当 中间有如下情况时,无法正确调用函数:
    汉字1.前一位<128 AND 汉字1.后一位>128 AND 汉字2.前一位<128
此时 StrConv对于 汉字1.后一位 和 汉字2.前一位 进行了混合编码,调用此类路径失败...用Byte()时:Private Declare Function GdipLoadImageFromFile Lib "gdiplus" (ByRef filename As Byte,_
                         Image As Long) As GpStatus
调用时:  If GdipLoadImageFromFile(bPath(0), gdip_Image) <> Ok Then  .....
发现上面混合编码的路径可以读取,但是其他路径又无法读取了,甚至是纯英文路径...
并且对于非混合路径的文件有时而可以调用,时而又不行的现象.请各位大大帮忙看一下,如果能同时用2种方式调用也行啊...

解决方案 »

  1.   

    如果参数定义为String类型,并且 Debug.print ImagePath 能输出正常的路径,不需要调用StrConv,VB会自动处理的。
      

  2.   

    严重关注中。也遇到了API调用的unicode问题。顺便问一下,bPath(0)是怎样定义的?
      

  3.   

    谢谢各位的关注!回Appow:
      关于bPath()的定义:
        Dim bPath() as Byte
        bPath() = ImagePath另,就是直接用ImagePath不行我才用StrConv啊... 要不何必多此一举.
      回家后我又看了下,当用String调用的声明时,用
      If GdipLoadImageFromFile(ImagePath, gdip_Image) <> Ok Then .....
      根本不能读取任何文件,如"F:\1.jpg"都不行. 检查ImagePath 和 bPath() 后没发现任何问题.
        甚至If GdipLoadImageFromFile("F:\1.jpg", gdip_Image) <> Ok Then .....  关键是我知道ImagePath的问题是由于VB6 StrConv()函数的Bug导致的.
      而不清楚,为什么用bPath()数组却不行....  我发帖是想了解VB调用API出问题的更深层次的原因,和其解决办法.
      而且我觉得这个问题很多初学者都会遇到,如果有好方法,也是帮大家啊.附VB6的源代码如下:Public Type ImageInfo
        Height As Long
        Width As Long
        FilePath As String
        ImageName As String
        Type As String
        FileSize As Long   'KB
    End TypePrivate Type GdiplusStartupInput
        GdiplusVersion As Long
        DebugEventCallback As Long
        SuppressBackgroundThread As Long
        SuppressExternalCodecs As Long
    End Typeprivate const OK =0Public Sub ShowFullImg(PBox As PictureBox, ImagePath As String)  
               'ImagePath是OpenFile对话框返回的,且去掉了后面的空格,绝对没问题.
        PBox.Cls
        Call LoadGDIP
        If GdipCreateFromHDC(PBox.hDC, gdip_Graphics) <> Ok Then
            MsgBox "出现错误!", vbCritical, "错误"
            GdiplusShutdown gdip_Token
            End
        End If
        GdipLoadImageFromFile StrConv(ImagePath, vbUnicode), gdip_Image
        If GdipDrawImage(gdip_Graphics, gdip_Image, 0, 0) <> Ok Then MsgBox "显示失败"
        Call DisposeGDIP
        PBox.RefreshEnd Sub
    Public Sub LoadGDIP()
        Dim GpInput As GdiplusStartupInput
        GpInput.GdiplusVersion = 1
        
        If GdiplusStartup(gdip_Token, GpInput) <> 0 Then
            MsgBox "加载GDI+失败!", vbCritical, "加载错误"
            End
        End If
    End SubPublic Sub DisposeGDIP()
        GdipDisposeImage gdip_Image
        GdipDeleteGraphics gdip_Graphics
        GdiplusShutdown gdip_Token
    End Sub
      

  4.   

    Private   Declare   Function   GdipLoadImageFromFile   Lib   "gdiplus"   (ByVal   filename   As   Long,Image   As   Long)   As   GpStatus 
     If   GdipLoadImageFromFile(Strptr(ImagePath),   gdip_Image)   <>   Ok   Then 
    ...
      

  5.   

    呵呵~~ 多谢VBAdvisor,你说的方法可以啊,跳过了VB的Unicode到ANSI的转换
      看了你的代码我豁然开朗. 给分.  另外我也发现为什么用Byte数组调用有时候可以,有时候又不行了.
      =.=!~ 公布一下,大家参考哈~~ (可惜米人给偶分)  声明不变,在
        Dim bPath() as Byte
        bPath() = ImagePath       '后面还应该加上一句:    ReDim bPath(Len(ImagePath) * 2 +1)  然后再调用GdipLoadImageFromFile(),呵呵,应该大家都清楚了吧...
      bPath() = ImagePath 的时候,bPath()的最后一个字节为 &H0,
      而调用时应该是类似于String类型,应该最后2个字节都要为 &H0 &H0
      所以,有时候判断ImagePath的尾部有错误,导致有时候能正常调用,有时候又调用失败的现象.    PS:其实 ReDim bPath(Len(ImagePath) * 2) 也行,多加1个 &H0. 个人觉得多一位安全些 呵呵~~~  好像是很低级的失误额....  见笑了.OK,我的任务也完成了,给分,结帖
      希望对大家有所帮助哈~~~
      

  6.   

    发现不知道怎么给分结帖...
      好像只有无满意结帖,VBAdvisor对不起了,只有一试了,不知道你收的到不...
      怎么没有给分结帖呢...