3

I have to pass from my C++ dll array to the C# program. Here is the C++ code:

 __declspec(dllexport) std::vector<std::string> __stdcall 
    getFilesByDirs
    (
        string directory, 
        std::string fileFilter, 
        bool recursively = true
    )
{
    int __ID = 0;
    std::vector<std::string> filesArray;

    if (recursively)
        getFilesByDirs(directory, fileFilter, false);

    directory += "\\";

    WIN32_FIND_DATAA FindFileData;
    HANDLE hFind = INVALID_HANDLE_VALUE;

    std::string filter = directory + (recursively ? "*" : fileFilter);

    hFind = FindFirstFileA(filter.c_str(), &FindFileData);

    if (hFind == INVALID_HANDLE_VALUE)
    {
        return filesArray;
    }
    else
    {
        if (!recursively)
        {
            if(isGoodForUs(directory + std::string(FindFileData.cFileName))) 
            {
                filesArray[__ID] = directory + std::string(FindFileData.cFileName);
                __ID ++;
            }
        }

        while (FindNextFileA(hFind, &FindFileData) != 0)
        {
            if (!recursively)
            {
                if(!isGoodForUs(directory + std::string(FindFileData.cFileName))) continue;
                filesArray[__ID] = directory + std::string(FindFileData.cFileName);
            }
            else
            {
                if ((FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)>0 && FindFileData.cFileName[0]!='.')
                {
                    if(!isGoodForUs(directory + std::string(FindFileData.cFileName))) continue;
                    getFilesByDirs(directory + std::string(FindFileData.cFileName), fileFilter);
                }
            }
            __ID ++;
        }

        DWORD dwError = GetLastError();
        FindClose(hFind);
    }

    return filesArray;
}

As you can see, there is a function that scanning for files by type. It's saved in the string array and returning out.

Now, here is the C# code:

[DllImport(@"files.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
        public static extern IntPtr getFilesByDirs(string path, string exns, bool rec=true);

and then i am calling to this method:

IntPtr a = getFilesByDirs("C:\\", "*.docx");

The problem is that nothing pass to my C# program from the Dll. Anyone can help with my issue?

4

1 回答 1

1

您需要返回的不是向量,而是原始类型,例如 char**。这里的问题是,为了使用它,您需要知道集合中有多少。作为埃德。S 在评论中说,您可能会发现使用 CLI 更容易(如果您可以使用 /clr 编译您的 C++)。但如果你能做到这一点,那么你可以在 C++ 中使用 .Net 类型(例如 List),并将你的 char* 编组为 C++ 端的字符串。

否则,您可以在 .Net 端返回原始 char* 的句柄。要在 C# 中使用 char*(也许已经使用过 C++,您会对此功能感到满意),您可以使用unsafe关键字,这样您就可以将这些 char* 转换为 unsafe 中的 System::String 并将它们添加到您的 .Net 收藏。

于 2013-09-20T20:48:29.900 回答