ライブラリから次の実装を使用しようとしています
C ++
int CALLBACK xCallback(long xmitlen, int buflen, char *buf, long flen)
{
return 0;
}
extern "C" __declspec(dllexport) int __stdcall TXFIlestransfer(int port, string fileName);
__declspec(dllexport) int __stdcall TXFIlestransfer(int port, string fileName)
{
int ret;
char *test = &fileName[0];
ret = sio_FtKermitTx(port, test, xCallback, 27);
return ret;
}
これをインポートしてC#で使用し、System.AccessViolationException: '保護されたメモリの読み取りまたは書き込みを試みました。これは多くの場合、他のメモリが破損していることを示しています。
このエラーを解決するための助けをいただければ幸いです。
sio_FtKermitTx
C ++ dll(Mydll.dll)の関数をシミュレートして、プログラムをテストしました。
int sio_FtKermitTx (int port, char *fname, int (CALLBACK *func) (long xmitlen, int buflen, char *buf, long flen), int key)
{
return 5;
}
そして、空の体でも、私はあなたと同じ問題を抱えています。
いくつかの調査の結果、問題は、何らかの理由(たとえば、Unicode /マルチバイト構成、または単に複雑なオブジェクトの共有が実装が難しいため)のコードstring
間C#
でオブジェクトを使用しているという事実に起因していることに気付きましたC++
。
解決策:オブジェクトをプリミティブ型に
置き換えるstring
ことでchar
、すべてが正しく機能します。
C#コード:
using System.Runtime.InteropServices;
namespace MyProgramme
{
class Test
{
// Import C++ DLL
[DllImport("Mydll.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern int TXFIlestransfer(int i, char[] filename);
//public static extern int TXFIlestransfer(int i, string filename); // this crash
static void RunTest(/*LoadFilterEVENTMessage msg*/)
{
string c = "ABC";
char[] char_arr = c.ToCharArray();
int i = TXFIlestransfer(3, char_arr);
// int i = TXFIlestransfer(3, c); string version crash
string s = i.ToString();
MessageBox.Show(s);
}
/* Methods in DLL being used below */
public static void Main()
{
RunTest();
}
};
}
C ++ DLLコード(Mydll.dll):
extern "C" __declspec(dllexport) int TXFIlestransfer(int port, char fileName[])
{
int ret;
char *test = &fileName[0];
ret = sio_FtKermitTx(port, test, xCallback, 27);
return ret;
}
とにかく、sio_FtKermitTx
関数はchar*
inパラメーターを受け入れるので、TXFIlestransfer
パラメーターをからstring
に変更してchar[]
も問題はありません。
結果:
C#プログラムを実行すると、次のようになります。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加