Excel中的Malloc错误称为.exe库

时间:2018-12-03 03:06:16

标签: c excel vba excel-vba malloc

我正在使用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(),如下图:

enter image description here

是中文,并说地址0x181FC1A中的内存访问冲突。

我进行了汇编调试,看来我没有加载包含malloc的库。我将尝试加载相关库,然后重试。

谢谢!

1 个答案:

答案 0 :(得分:0)

问题是,PE被编译为.exe文件。

从Excel进程调用时,.exe文件仅提供功能,而不会加载相关的库和依赖项。

要修复此问题,需要应用.dll格式,因此Windows PE加载程序会将正确的依赖项加载到正确的地址中。