私は、C++ でビルドした 1 つの dll と、C# でビルドした 1 つのソフトウェア (Windows フォーム) を持っています。
C# 経由で dll を呼び出すと、致命的な例外が発生しました。
保護されたメモリを読み書きしようとしました。これは多くの場合、他のメモリが破損していることを示しています。
呼び出しは次のとおりです。
[DllImport("dlltest.dll")]
[return: MarshalAs(UnmanagedType.SafeArray)]
private extern static string[] getFiles(string directory, string fileFilter, bool recrusive);
私のDLLソースからのコードは次のとおりです。
extern "C" __declspec(dllexport) LPSAFEARRAY getFiles(string directory, std::string fileFilter, bool recrusive);
LPSAFEARRAY getFiles(string directory, std::string fileFilter, bool recrusive)
{
std::vector<std::string> filesArray;
if (recrusive)
getFilesByDirs(directory, fileFilter, false);
directory += "\\";
WIN32_FIND_DATAA FindFileData;
HANDLE hFind = INVALID_HANDLE_VALUE;
std::string filter = directory + (recrusive ? "*" : fileFilter);
hFind = FindFirstFileA(filter.c_str(), &FindFileData);
if (hFind == INVALID_HANDLE_VALUE)
{
}
else
{
if (!recrusive)
{
if(isGoodForUs(directory + std::string(FindFileData.cFileName)))
{
filesArray.push_back(directory + std::string(FindFileData.cFileName));
}
}
while (FindNextFileA(hFind, &FindFileData) != 0)
{
if (!recrusive)
{
if(!isGoodForUs(directory + std::string(FindFileData.cFileName))) continue;
filesArray.push_back(directory + std::string(FindFileData.cFileName));
}
else
{
if ((FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)>0 && FindFileData.cFileName[0]!='.')
{
if(!isGoodForUs(directory + std::string(FindFileData.cFileName))) continue;
filesArray.push_back(directory + std::string(FindFileData.cFileName));
}
}
}
}
CComSafeArray<BSTR> a(filesArray.size());
std::vector<std::string>::const_iterator it;
int i = 0;
for (it = filesArray.begin(); it != filesArray.end(); ++it, ++i)
{
a.SetAt(i, A2BSTR_EX((*it).c_str()), FALSE);
}
return a.Detach();
}
誰が問題が何であるか知っていますか?