我所拥有的
我有个奇怪的问题我有一个读取PCAP文件的大程序现在我想在这个pcap文件中进行搜索正如我提到的,这个程序非常大,所以我有很多函数和参数等。这是一个Win32应用程序,我使用MinGW。
我想要什么
现在,我想执行区分大小写的搜索(strstr)或不区分大小写的搜索(StrStrIfromShlwapi)取决于用户在GUI中选择了什么搜索量很大,可以设置很多参数所以我不想总是问if (caseSensitve) then strstr(...) else StrStrI(...),我想在一开始就做决定,我把它写在一个结构中,struct会经历不同的功能。
有什么问题:
当我像下面所示那样做时,当选择不区分大小写时,我的程序在使用3次__strstr后停止工作(因此它将运行StrStrI)当选择区分大小写时,__strstrstrstr)工作正常但当我直接使用StrStrI时,它也能完美地工作。。。
我总是收到来自Eclipse的警告:
来自不兼容指针类型的赋值[默认启用]
但为什么呢LPSTRchar*是一样的,不是吗函数的typedef返回是char*?!
这听起来很复杂,嗯下面是一个示例代码这正是我的大程序中的编程方式要测试它,您需要添加Shlwapi库。

/*
 * pcap.c
 *
 *  Created on: 05.01.2015
 *      Author: Max
 */

#include <windef.h>
#include <stdlib.h>
#include <stdio.h>
#include <shlwapi.h>//need to add library shlwapi!

typedef char* (*__StrStr)(const char* str1, const char* str2);

typedef struct _findData {
    __StrStr               __strstr; //string in string function (either strstr (cs) or StrStrI (ci))
    char fCaseSensitve :1;
} findData;

void findDataTest(findData *tFindData);
void findDataTest2(findData *tFindData);

char * Test1 = "HELLO";
char * Test2 = "lo";

int main() {
    findData *tFindData = malloc(sizeof(findData));

    setbuf(stdout, NULL); //do not buffer stdout

    tFindData->fCaseSensitve = 1; //set case sensitve

    findDataTest(tFindData); //works perfect!

    tFindData->fCaseSensitve = 0; //set case insensitve

    findDataTest(tFindData); //abort after 3 times
    return 0;
}

void findDataTest(findData *tFindData) {
    if (tFindData->fCaseSensitve)
        tFindData->__strstr = strstr; //if case sensitive use strstr
    else
        tFindData->__strstr = StrStrIA; //Warning from Eclipse: assignment from incompatible pointer type [enabled by default], but why? LPSTR == char*

    findDataTest2(tFindData); //and here we test it
}

void findDataTest2(findData *tFindData) {
    __StrStr  __strstr;
    int i = 0;

    __strstr = tFindData->__strstr;

    for (; i < 10; i++) {
        printf("Test %d:\t", i);

        //if (StrStrI(Test1, Test2)) //this works like a charm!
        if (__strstr(Test1, Test2)) //this abborts after 3 times on case insenstive
            printf("str is in str!\n");
        else
            printf("nope! str isn't in str!\n");
    }
}

最佳答案

StrStrI*()-函数不使用cdecl而是使用stdcall调用约定。
为了解决这个问题,您可能需要在StrStrI*()函数周围引入一个包装器,如下所示

char * strstri(const char * s1, const char * s2)
{
  return StrStrIA(s1, s2);
}

初始化指向比较函数的指针
void findDataTest(findData *tFindData)
{
  if (tFindData->fCaseSensitve)
    tFindData->__strstr = strstr; //if case sensitive use strstr
  else
    tFindData->__strstr = strstri;

  findDataTest2(tFindData); //and here we test it
}

另请注意:不要使用__在C代码中添加任何前缀,因为(在大多数情况下)这是C标准不允许的。
例如,用__StrStr替换StrStrFunc,用__strstrpfstrstr替换strstrfunc

09-07 23:42