首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CreateDir在QB64中抛出异常

CreateDir在QB64中抛出异常
EN

Stack Overflow用户
提问于 2017-07-08 05:22:33
回答 3查看 160关注 0票数 0

下面的代码有时会在尝试创建新目录时返回错误。有时,当该目录不存在时,它会抛出一个错误,而不会创建该目录。我想知道为什么?

代码语言:javascript
复制
DECLARE DYNAMIC LIBRARY "kernel32"
    FUNCTION CreateDirectoryA% (F$, X$)
    FUNCTION GetLastError& ()
END DECLARE
F$ = "TEMPX" + CHR$(0) ' new directory to create
x = CreateDirectoryA(F$, CHR$(0))
IF x = 0 THEN
    IF GetLastError = &H3E6 THEN
        PRINT "Invalid access to memory location."
    END IF
END IF

这段代码是用QB64编写的。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-07-11 02:31:49

作为lpSecurityAttributes参数传递的CreateDirectoryA是长度为0的字符串;字符串仍然具有内存地址,这意味着要传递一个非空指针。CreateDirectoryA将其解释为指向第一个字节设置为0的属性结构的指针。结构中的其余字节都是未初始化的内存,这意味着结构的第一个字段nLength在一台小型endian机器上可能类似于0xFFFFFF00,这是一个无效的大小。该结构的lpSecurityDescriptor字段可能也充满了字节(可能是由程序访问的,但可能不是),因此这也可能导致问题。

你可以很容易地解决这个问题:

代码语言:javascript
复制
' X%& may also be written X AS _OFFSET.
FUNCTION CreateDirectoryA% (F$, BYVAL X%&)

...

x = CreateDirectoryA(F$, 0)

这将正确地传递NULL指针。BYVAL关键字是必要的,否则您将传递指向_OFFSET值的指针(因为QB64中的所有内容都是通过指针传递的,除非您使用BYVAL关键字;字符串和用户定义的类型不能传递BYVAL)。

票数 1
EN

Stack Overflow用户

发布于 2017-07-08 05:36:36

此代码强制在异常x3E6发生时创建目录,但解释了错误发生的原因:

代码语言:javascript
复制
DECLARE DYNAMIC LIBRARY "kernel32"
    FUNCTION CreateDirectoryA% (F$, X$)
    FUNCTION GetLastError& ()
END DECLARE
DO
    F$ = "TEMPX" + CHR$(0) ' new directory to create
    x = CreateDirectoryA(F$, CHR$(0))
    IF x THEN ' successful create
        EXIT DO
    END IF
    IF x = 0 THEN
        REM Test for Invalid access to memory location.
        IF GetLastError = &H3E6 THEN
            _DELAY .2
        ELSE
            EXIT DO
        END IF
    END IF
LOOP
票数 0
EN

Stack Overflow用户

发布于 2017-07-18 04:17:15

然后我遇到了在路径中创建子目录的问题,所以我写了如下:

代码语言:javascript
复制
DECLARE DYNAMIC LIBRARY "kernel32"
    FUNCTION CreateDirectoryA% (F$, BYVAL X&&)
    FUNCTION GetLastError& ()
END DECLARE
DO ' get directory
    PRINT "Dir";: INPUT Directory$
    IF Directory$ = "" THEN END
    GOSUB CreateDir
LOOP
END
CreateDir:
' construct path
Directory$ = RTRIM$(Directory$)
IF RIGHT$(Directory$, 1) <> "\" THEN
    Directory$ = Directory$ + "\"
END IF
' create path
x = 0
Next.Dir = INSTR(Directory$, "\")
DO
    IF Next.Dir = False THEN
        EXIT DO
    END IF
    SubDir$ = LEFT$(Directory$, Next.Dir - 1) ' \tempx\t1\t2\t3\
    Next.Dir = INSTR(Next.Dir + 1, Directory$, "\")
    ' make directory name
    IF LEN(SubDir$) THEN
        ' create directory
        f$ = SubDir$ + CHR$(0)
        x = CreateDirectoryA(f$, 0)
        ' check error
        IF x = 0 THEN
            IF GetLastError& = &HB7 THEN ' ignore already exists
                ' nul
            ELSE
                EXIT DO
            END IF
        END IF
    END IF
LOOP
IF x = 0 THEN
    PRINT "Error x"; HEX$(GetLastError&)
ELSE
    PRINT "Directory created."
END IF
RETURN

这样,如果指定不存在的路径,它将创建整个路径名。例如,如果\Temp不存在,则\Temp\t1\t2\t3。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44982820

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档