我正在使用64位Office 365和Windows 10操作系统。
我使用Visual Studio 2017社区编译.exe文件。
每次遇到malloc()
函数时,都会报告违反了内存访问。
由于有些数据库API也使用了malloc
,因此我几乎无法停止使用malloc
。
以下是Excel(VBA)中的代码:
Option Explicit
Public Declare PtrSafe Function ExcelCalc Lib "E:\AEONLIFE\CalcMProj\ActThread2\x64\Debug\ActThread2.exe" ( _
ByVal PlanCode As String, _
ByVal chnl As Long, _
ByVal sensi As Long, _
ByRef a As Double, _
ByRef b As Double) As Long
Dim a(0 To 1273) As Double
Dim b(0 To 1273) As Double
Sub test()
Dim c As Long
Dim PlanCode As String
c = ExcelCalc("502001", 1, 0, a(1), b(1))
End Sub
以下是C代码:
extern __declspec(dllexport) int WINAPI ExcelCalc(char *PlanCode, int chnl, int scen, double *a, double *b)
{
#pragma region 初始化
//********** 本地变量 **********
double mfac = (double)1 / (double)YEARSTEP;
char TempPID[PlanIDLEN];
int Ind, PlanCodeInt;
DB dbconn;
pfdrv ProfDrv;
tData Data;
temp Temp;
//********** 申请堆空间 **********
cashflow *CashFlow = malloc(sizeof(cashflow));
sensi *Sensi = malloc(sizeof(sensi));
calcconst *CalcConst = malloc(sizeof(calcconst)*MAXCHNL);
cf_calc *CF_Calc_Base = malloc(sizeof(cf_calc));
rate_calc *RateCalc = malloc(sizeof(rate_calc));
decrate *DecRate = malloc(MAXCHNL * sizeof(decrate));
//********** 链接数据库 **********
if (dbconnect(&dbconn) == FAIL) { return 0; };
#pragma endregion
strcpy_s(&TempPID[0], sizeof(TempPID), PlanCode);
TempPID[4] = 0;
PlanCodeInt = atoi(&TempPID[0]);
LoadAsump(PlanCode, &dbconn, DecRate, CashFlow, Sensi, CalcConst, &ProfDrv, mfac);
Ind = LoadTemp(&Data, &Temp, DecRate, &CashFlow->GCV[0], &CashFlow->CFOutgo[chnl], mfac);
Calc_CashFlow(&Temp, CF_Calc_Base, &CashFlow->CFOutgo[chnl], &CalcConst[chnl], PlanCodeInt, mfac);
CalcDec(&Temp, &DecRate[chnl], RateCalc, &Sensi->SensiRT[scen][0], &CalcConst[chnl], mfac);
#pragma region 计算后处理
//********** 释放堆空间 **********
free(DecRate);
free(CashFlow);
free(Sensi);
free(CalcConst);
//********** 断开链接 **********
dbcleares(&dbconn);
PQfinish(dbconn.conn);
#pragma endregion
a[0] = 1;
a[1] = 3.5;
b[0] = 1;
b[1] = 7;
return 1;
}
有点复杂,但是错误出现在第12行,第一个malloc(),如下图:
是中文,并说地址0x181FC1A中的内存访问冲突。
我进行了汇编调试,看来我没有加载包含malloc的库。我将尝试加载相关库,然后重试。
谢谢!
答案 0 :(得分:0)
问题是,PE被编译为.exe文件。
从Excel进程调用时,.exe文件仅提供功能,而不会加载相关的库和依赖项。
要修复此问题,需要应用.dll格式,因此Windows PE加载程序会将正确的依赖项加载到正确的地址中。