没有重载函数“ strstr”的实例与参数列表匹配

时间:2020-05-05 22:14:05

标签: c++

E0304   no instance of overloaded function "strstr" matches the argument list

尝试编译时出现此错误,我该如何解决?发布代码,最好先了解图片再了解。 所以这是我得到的错误,我不知道是什么原因导致的,以及如何解决。

int MakeWindows();
int CloseWindows();

int WINAPI WinMain(_In_HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPSTR lpCmdLine, _In_ int nCmdShow)
{

   HW_PROFILE_INFO hwProfileInfo;
   const char* cHWID = "{1234-5678-9669-1337}"; //


   if (GetCurrentHwProfile(&hwProfileInfo) != NULL) }
        printf("Hardware ID: %s\n", hwProfileInfo.szHwProfileGuid);

        if (strstr(hwProfileInfo.szHwProfileGuid, cHWID)) {
           printf("Your hardware ID was successful\n\n");
           Sleep(3069);
           system("CLS");

        }
        else {
             printf("Your Hardware ID was denied;\n");
             Sleep(1000);
             TerminateProcess(GetCurrentProcess(), NULL);
        }
    }
    else {
         return 0;
    }
};

2 个答案:

答案 0 :(得分:1)

strstr希望char*作为其第一个参数。 szHwProfileGuid将是一个宽字符串。您需要wccstr

所以尝试:

const wcchar* cHWID = L"{1234-5678-9669-1337}";

答案 1 :(得分:0)

问题源于您的项目被编译为Unicode(“宽”字符,通常为wchar_t类型或在Windows中定义为WCHAR),并且您还使用了单字节字符({{1 }}或char),例如在您致电strstr()时。

(正如您在这里看到的那样,这两个合作并不顺利!)

Windows API定义了其许多结构的两个版本(以及相应的使用它们的功能),一个用于容纳每种字符类型。在您的代码示例中,对于API的宽字符版本,CHAR实际上被定义为HW_PROFILE_INFO,并且您正在调用HW_PROFILE_INFOW()。这是好的设计,因为您的构建是作为Unicode构建进行检测的。

有几种方法可以解决此问题;这是一个简单的方法(您的原始代码进行了两个小修改):

GetCurrentHwProfileW

这组简单的更改使您明确使用WINAPI函数的单字节版本,使对strstr()的调用与其两个参数保持一致。

(我会再次提到,这只是解决此问题的一种方法,“最佳”解决方案可能是主观的。:))