System.Runtime.InteropServices.ExternalException (0x80004005): GDI+ 中发生一般性错误。

近日在使用Spire.Xls 进行excel数据直接导出成图片功能时,提示如上错误。

经过排查excel路径,文件夹权限等等,搁置了2天都没办法解决。

偶然看中间测试的历史日志,发现出现过 System.OutOfMemoryException: Size of image is too large 字眼,
所以怀疑是Spire.Xls控件的数据性能有问题,因为我设置了源excel的表格2W行的统一格式。

大刀斩乱麻,将所有带格式的空白行删除,哇解决了。
然后就入坑解决动态导出数据同时设置格式的问题(半小时ok)上。

psss。

如上记录在案

因为项目的需要,在常用VS2019的机器上,重新安装了一个VS2012后,发现系统出现了无法添加引用,重新修复过VS2019,故障依旧提示错误

对COM组件的调用返回了错误 “HRESULT E_FAIL”

进入 vs2019安装目录下,然后运行指令:gacutil -i Microsoft.VisualStudio.Shell.Interop.11.0.dll 即可
(安装目录)Professional\Common7\IDE\PublicAssemblies

背景:很久没有接触VBA的需求了,今天有个需求出现,客户那边的二维码激光打印可能出现重复,需要在操作完之后,进行扫码排重,
并且现场提示工作人员进行处理(不能交到购买终端客户手上才发现);

细节过程:
1、打开Excel就直接进行提示扫码录入,不要让操作工点键盘什么的,可以触屏即可;
2、扫码枪扫描完毕,直接就时间和二维码内容;
3、判断内容是否重复,弹框提示,并且中断进程;
4、增加弹框轮询的退出机制,录入Q/q字母即可退出;

5、初次接触宏的快捷键操作


Dim isrun As Boolean

Sub autoinput()
'
' autoinput 宏
'
' 快捷键: Ctrl+Shift+I
    isrun = True

    Dim I As Long

    Do While (isrun)
    I = Application.WorksheetFunction.Max(2, Range("B" & Rows.Count).End(xlUp).Row + 1)
    
    Dim str As String
    str = InputBox("请扫码录入")
    If (str = "q" Or str = "Q") Then
       isrun = False
       Exit Sub
    End If
    
    If str <> "" Then
        If CheckIsRepeat(str) Then
            isrun = False
            Exit Sub
        End If
    
        Range("B" & I).Value = str
        Range("A" & I).Value = DateTime.Date & " " & DateTime.Time
    End If
    

    ActiveWorkbook.Save
    Loop
End Sub

Private Sub Workbook_Open()
    Call VBAProject.mainmodel.autoinput
End Sub

'排重方法1,通过系统的CountIf来进行重复计数,比较靠谱
Private Function CheckIsRepeat(inv) As Boolean
    If Application.WorksheetFunction.CountIf(ActiveSheet.Columns(2), inv) >= 1 Then
        msg = MsgBox(inv & Chr(10) & "数据重复!!!!" & "数据重复!!!!" & Chr(10) & "数据重复!!!!", vbOKOnly, "重复提示")
 
      'If msg = vbOKOnly Then '选择不保留则该单元格赋空值
        CheckIsRepeat = True
      'End If
    Else
        CheckIsRepeat = False
    End If
End Function

'方法2 通过字典进行排重判断,有bug
Private Function CheckIsRepeat2(inv) As Boolean
    Set Db = CreateObject("Scripting.Dictionary")
    Dim isrepeat As Boolean
    isrepeat = False
    
    For I = 0 To ActiveSheet.UsedRange.Rows.Count
        Dim tv As String
        tv = Trim(Range("B" & I + 2).Value)
        
        If tv <> "" Then
            If Db(tv) Then
                MsgBox "第" & I & "行数据【" & tv & "】重复!"
                isrepeat = True
                Exit For
            Else
                Db(tv) = True
            End If
        End If
    Next I
    
    CheckIsRepeat = isrepeat
End Function


手上的一台二手戴尔工作站笔记本,之前用没留意,近段时间突然发现一个很诡异的问题。

凡是拔插USB 都可能出现系统挂死情况(俗称死机),可以看到界面,但是按键和鼠标完全不会动。
从旁边的机器ping以及访问网上邻居也访问不了,只能强制按电源键。

甚至在设备管理里边删除蓝牙或者usb都会死机;

分析可能情况:
1、驱动问题;
测试:用鲁数据和官方的Support来检查,都提示驱动时最新的,没有异常;
2、主板的usb接口有问题,也就是主板有问题;
测试:先插usb然后开机,一切都正常,只有在拔插时导致死机,很大情况怀疑会不会usb模块存在电位闪动类似电气状况导致系统死机;个人又缺少一些设备来检测电波
3、系统问题;
测试:要重装,码农的工作环境,重装要很慎重,刚开始都不敢想这个步骤;

后来前天晚上一狠心,没怎么备份C盘,直接刷新的Win10,然后就好了~~~~

重装系统本来想着用回win7,谁知道当时所有的备份硬盘竟然都在办公室

出现的原因我只能怪win10,win7我觉得要是死机也会给个蓝屏就好了。

重要的事情说3次:我讨厌win10,我讨厌win10,我讨厌win10.