Ошибка Malloc в Excel называется библиотекой .exe - PullRequest
0 голосов
/ 03 декабря 2018

Я использую Office 365 в 64-разрядной версии с ОС Windows 10.

Я компилирую свой файл .exe с сообществом Visual Studio 2017.

Каждый раз, когда я встречал функцию malloc(), он сообщает о нарушении доступа к памяти.

Для меня почти невозможно отказаться от использования malloc, так как есть некоторые API базы данных, которые также используются 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 голосов
/ 04 декабря 2018

Дело в том, что PE был скомпилирован как файл .exe.

При вызове из процесса Excel файл .exe предоставляет только функцию, но не загружает связанные библиотеки и зависимости.

Чтобы исправить это, необходимо применить формат .dll, поэтому загрузчик Windows PE загрузит правильные зависимости в правильный адрес.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...