SQLiteForExcel icon indicating copy to clipboard operation
SQLiteForExcel copied to clipboard

Backup API does not work on 64-bit Excel

Open SoerenBusse opened this issue 9 years ago • 13 comments

If I try to run the "AllTests" method in the example project, excel crashes with the error: "Excel has stopped working". Nothing else?

I'm using Excel 2013

SoerenBusse avatar May 31 '16 17:05 SoerenBusse

Are you perhaps using the 64-bit version of Excel?

govert avatar May 31 '16 18:05 govert

Yop

SoerenBusse avatar May 31 '16 19:05 SoerenBusse

Are you running the SQLiteForExcel_64.xlsm? Did you copy the x64 directory and that version of SQLite3.dll too? On which line does it crash?

govert avatar May 31 '16 19:05 govert

I've downloaded the whole repository. Then I started the *_64.xlsm file. There's no line. Whole excel is crashing.

SoerenBusse avatar May 31 '16 19:05 SoerenBusse

I think it might be a problem with the backup API. You can comment out the line calling TestBackup inside Sub AllTests(). I'll have a look - the declaration of the backup API was added later, and might not be right for 64-bit.

govert avatar May 31 '16 20:05 govert

Confirming 64 bit Excel crash on running AllTests. Yes indeed, you can comment out calling TestBackup and have the other tests run. Takes > minute to run the other tests. Trouble traced to SQLite3.dll, sqlite3_backup_step function.

Module Sqlite3Demo.bas
	Sub AllTests
		SQLite3Initialize 'in Module Sqlite.bas
			LoadLibrary ' SQLite3.dll
		SQLite3BackupStep 'in Module Sqlite3.bas, the line that crashes Excel
			sqlite3_backup_step 'in Module Sqlite.bas, calls the function in the dll
				contained in SQLite3.dll

R-J-L avatar Nov 26 '16 14:11 R-J-L

I wonder what's wrong though - the declaration looks fine to me, comparing with the documentation here: https://www.sqlite.org/c3ref/backup_finish.html

govert avatar Nov 26 '16 17:11 govert

I have zero background in C, or any languages using pointers. (and its been decades since I could PEEK or POKE ...) I have a medium level background in VBA programming. My background in SQL is only as an end user, not as a DBA or DB programmer. So, not sure I can be of much help here?


myBackupHandle = SQLite3BackupInit(myDbBackupHandle, "main", myDbHandle, "main")
In my case returns a large negative number for myBackUpHandle? (Dim myDbHandle As LongPtr) Next statement follows:

    If myBackupHandle <> 0 Then
        RetVal = SQLite3BackupStep(myBackupHandle, -1)
        Debug.Print "SQLite3BackupStep returned " & RetVal
        RetVal = SQLite3BackupFinish(myBackupHandle)
        Debug.Print "SQLite3BackupFinish returned " & RetVal
    End If
	
Since myBackUpHandle is a negative number the statement above runs. The call in the above statement:
SQLite3BackupStep() leads to the function that actually bombs.
```

So, I'm checking with you, can myBackupHandle be negative, and is -1 number of pages O.K.?
any issues with  VBA itself (LongPtr resolving to LongLong in 64-bit versions of Office?)
http://stackoverflow.com/questions/24095500/making-long-variables-work-in-64-bit-and-32-bit-excel-vba#24098334

Another novice question - can we use the Object Browser (perhaps by some type of reference) to browse around the contents of the DLL? 

R-J-L avatar Nov 26 '16 20:11 R-J-L

Did you ever figure out what was going on here? This line in TestBackup() causes the crash: RetVal = SQLite3BackupStep(myBackupHandle, -1)

I'm running SQLiteForExcel_64.xlsm on Excel 2016 64-bit

arildj78 avatar Sep 19 '17 10:09 arildj78

@arildj78 I've not taken a closer look yet. I'd be interested if you find anything.

govert avatar Sep 19 '17 10:09 govert

Ok. I'm not sure if I need this function yet. I've never used SQLite and just barely SQL. I'm now trying to use Excel as front-end for a DB project. I'll update you if I stumble over the solution.

arildj78 avatar Sep 19 '17 10:09 arildj78

Sqlite3_64.bas or SQLiteForExcel_64.xlsm module "Sqlite3" sqlite3_backup_init()As Long → As LongPtr

before Private Declare PtrSafe Function sqlite3_backup_init Lib "SQLite3" (ByVal hDbDest As LongPtr, ByVal zDestName As LongPtr, ByVal hDbSource As LongPtr, ByVal zSourceName As LongPtr) As Long After Private Declare PtrSafe Function sqlite3_backup_init Lib "SQLite3" (ByVal hDbDest As LongPtr, ByVal zDestName As LongPtr, ByVal hDbSource As LongPtr, ByVal zSourceName As LongPtr) As LongPtr

good job!

jikosan avatar May 30 '19 09:05 jikosan

@jikosan Cool - thanks for spotting that!

govert avatar May 30 '19 10:05 govert