-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathExcelUtilsX.cpp
More file actions
99 lines (82 loc) · 2.49 KB
/
ExcelUtilsX.cpp
File metadata and controls
99 lines (82 loc) · 2.49 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#define _CRT_SECURE_NO_WARNINGS
#include "windows.h"
#include "WinUtils.h"
#include "ExcelUtils.h"
#include "XlUnitSupport.h"
namespace ExcelUtils {
BSTR CharPtrToBSTR(const char * charPtr) {
if (!charPtr) return nullptr;
size_t len = charPtr ? strlen(charPtr) : 0;
return SysAllocStringByteLen(charPtr, (UINT)len); //SysAllocStringByteLen appends a 1-byte null terminator
}
BSTR WcharPtrToBSTR(const wchar_t * charPtr) {
if (!charPtr) return nullptr;
size_t len = charPtr ? wcslen(charPtr) : 0;
//return SysAllocStringByteLen((char*)charPtr, (UINT)(2*(len + 1)));//SysAllocStringByteLen appends a 1-byte null terminator
return SysAllocStringByteLen((char*)charPtr, (UINT)(2 * len));//SysAllocStringByteLen appends a 1-byte null terminator
}
//VARIANT MakeVariant_Double(double value) {
//
// VARIANT retVal;
//
// retVal.vt = VT_R8;
// retVal.dblVal = value;
//
// return retVal;
//}
//
//VARIANT MakeVariant_Error(int errorCode) {
//
// VARIANT retVal;
//
// retVal.vt = VT_ERROR;
// retVal.scode = errorCode;
//
// return retVal;
//}
//
//VARIANT MakeVariant_String(wchar_t * str) {
//
// VARIANT retVal;
//
// retVal.vt = VT_BSTR;
// retVal.bstrVal = str ? SysAllocString(str) : str;
//
// return retVal;
//}
void SEH_Translate(unsigned int u, PEXCEPTION_POINTERS pExp) {
const char * errorMsg = "An error occured.";
bool critical = false;
switch (pExp->ExceptionRecord->ExceptionCode) {
case EXCEPTION_ACCESS_VIOLATION:
critical = true;
errorMsg = "A serious error occured (memory access violation).\nExcel may crash at any moment.\n\nConsider saving now.\n";
break;
case EXCEPTION_INT_DIVIDE_BY_ZERO:
errorMsg = "An integer divide by zero error occured.";
break;
case EXCEPTION_INT_OVERFLOW:
critical = true;
errorMsg = "A serious error occured (stack overflow).\nExcel may crash at any moment.\n\nConsider saving now.\n";
break;
}
CoreDump(errorMsg, pExp, GetCurrentThreadId(), "", 0, "", false);
throw MyException(errorMsg, critical);
}
VARIANT ExceptionHandler(std::exception_ptr eptr) {
try {
if (eptr) {
std::rethrow_exception(eptr);
}
}
catch (const std::exception& e) {
auto errMsg = e.what();
if (errMsg && errMsg[0] == '#') return ExcelUtils::MakeVariant_String(xFormat(L"%S", errMsg));
return ExcelUtils::MakeVariant_String(xFormat(L"# %S #", e.what()));
}
catch (...) {
return ExcelUtils::MakeVariant_String(L"# CRITICAL ERROR #");
}
return ExcelUtils::MakeVariant_String(L"???");
}
}