C++ 中的外部 dll、静态函数和 char* 关系

Posted

技术标签:

【中文标题】C++ 中的外部 dll、静态函数和 char* 关系【英文标题】:external dll, static function and char* relation in C++ 【发布时间】:2013-07-23 21:32:54 【问题描述】:

我正在尝试弄清楚如何正确编码这种情况:

在 C++ 应用程序中,我通过 LoadLibrary 调用外部 DLL,然后:

char * _input = new ... is  created here with some data
char *aallocchrar =new char[10000];
fnHello(_input,aallocchrar);

fnHello 是 dll 中的静态函数。它返回 void,但用一些数据填充 aallocchrar 指针。

在这之后,我做

delete[] _aallocchrar;

它总是抛出内存错误。在静态函数内部,最后,我尝试使用:

return 0;
exit(1);

exit(1) 即使在函数执行时也会崩溃。

如何完美地做到这一点?传递指针,填充数据,退出 dll 函数。为什么那个邪恶的 dll 改变了我的 aallochar 函数,我以后不能删除 [] 它?我应该如何正确结束静态 dll 函数 - 退出? - 所以它应该释放我的指针?

在 dll 函数中,我对 _aallocchrar* 所做的只是:

strcat (str, ";\n\n");

我不会重新分配它或类似的东西。函数定义为:

void __declspec(dllexport) __cdecl runMainRoutine(char* _inputString, char* finalResult)

EDIT1:此函数适用于传递的字符数组:

char* eqn_output(pPLA PLA, char* str)


//
register pcube p, last;
register int i, var, col, len;
int x;
bool firstand, firstor;

if (cube.output == -1)
fatal("Cannot have no-output function for EQNTOTT output mode");
if (cube.num_mv_vars != 1)
fatal("Must have binary-valued function for EQNTOTT output mode");
makeup_labels(PLA);

/* Write a single equation for each output */
for(i = 0; i < cube.part_size[cube.output]; i++) 

strcat (str, OUTLABEL(i));
strcat (str, " = ");
//printf("%s = ", OUTLABEL(i));
col = strlen(OUTLABEL(i)) + 3;
firstor = TRUE;

/* Write product terms for each cube in this output */
foreach_set(PLA->F, last, p)
    if (is_in_set(p, i + cube.first_part[cube.output])) 
    if (firstor)
    
        strcat (str, "(");
        col += 1;           
       // printf("("), col += 1;
    
    else
    
    strcat (str, " | (");   
    col += 4;
    //printf(" | ("), col += 4;

    
    firstor = FALSE;
    firstand = TRUE;

    /* print out a product term */
    for(var = 0; var < cube.num_binary_vars; var++)
        if ((x=GETINPUT(p, var)) != DASH) 
        len = strlen(INLABEL(var));
        if (col+len > 72)
        
            strcat (str, "\n    "); 
            col = 4;
            //printf("\n    "), col = 4;
        
        if (! firstand)
        
            strcat (str, "&");
            col += 1;
            //printf("&"), col += 1;
        
        firstand = FALSE;
        if (x == ZERO)
        
            strcat (str, "!");
            col += 1;
            //printf("!"), col += 1;
        
        //printf("%s", INLABEL(var)), col += len;
        strcat (str, INLABEL(var));
        col += len;
        
    //printf(")"), col += 1;

    strcat (str, ")");
    col += 1;
    
strcat (str, ";\n\n");
//printf(";\n\n");

【问题讨论】:

缓冲区溢出了吗?您没有将缓冲区大小传递给 DLL 函数,您确定缓冲区足够大吗? 老兄,为什么不 YOU 告诉 US 为什么“邪恶的 dll 改变了 aallocchrar”? “fnHello”的代码在哪里???还:您是否尝试过使用 MSVS 调试器进入代码?你看到了什么? 嗯,在 Visual Studio 调试窗口中,我可以看到 aallocchrar 在 char 数组的 处附加了新数据。我想这意味着缓冲区没有溢出,否则我会立即出错,但不会出现在 delete[] 行,对吗? 函数代码很大,我尽力解释了。它对 aallocchrar 所做的只是在 DLL 中使用 strcat 附加一些数据 @user2426290:你猜错了。调试窗口只打印第一个 NUL 之前的所有内容,就像所有字符串处理函数一样。它不检查是否溢出。 【参考方案1】:

听起来您正在对未初始化的字符串执行“strcat()”。

我认为这可能会导致分段违规,嗯?

问:如果你替换“strcpy()”会发生什么?您是否仍然遇到此问题?

【讨论】:

谢谢大家的回复。也许这确实是溢出问题,因为我一直在使用 strcat 。我以为 Visual Studio 2012 会立即崩溃。现在去检查一下。 @user2426290 写入传递数组绑定未定义。 VS2012 没有任何义务崩溃。如果它崩溃了,那只是意味着你很幸运能看到它。 天哪,我真的用过统一字符串。必须是: char *aallocchrar =new char[10000]();用C#写了2年这么多,感觉迟钝

以上是关于C++ 中的外部 dll、静态函数和 char* 关系的主要内容,如果未能解决你的问题,请参考以下文章

c#调用C、C++编写的dll

C++ DLL char* 返回问题

Visual C++ - 覆盖从 DLL 导入的函数?

C++ -- VS2017实际项目调用外部DLL经历

调用从 c# 返回 char* 的 c++ dll 函数。无法使用 DllImport()

c#调用c++的DLL,接口函数参数有函数指针,在线等解决办法