私は現在、DLLでエクスポートされた関数とC#でのP/invokeを調査しています。非常に単純な.dllを作成しました。
Test.h
#ifndef TEST_DLL_H
#define TEST_DLL_H
extern "C" __declspec(dllexport) const char * __cdecl hello ();
extern "C" __declspec(dllexport) const char * __cdecl test ();
#endif // TEST_DLL_H
Test.cpp
#include <stdlib.h>
#include "test.h"
#include <string.h>
const char* hello()
{
char *novi = (char *)malloc(51);
strcpy(novi, "Test.");
return novi;
}
const char * test()
{
return "Test.";
}
私はそれをコンパイルし、次のようにC#プロジェクトで使用しました:
[DllImport("test.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr hello();
[DllImport("test.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern string test();
private void button1_Click(object sender, EventArgs e)
{
MessageBox.Show(test());
IntPtr a = hello();
MessageBox.Show(Marshal.PtrToStringAnsi(a));
}
しかし、それは機能していません。test()
正常に呼び出され、正しい文字列が返されます。しかしhello()
、プログラムを切るだけです。定義からmalloc行を削除してhello()
定数を返すと、すべてが機能するので、現在認識しているmallocに問題があると思います。
また、returntypeがchar*の場合、文字列を使用すべきではないことをどこかで見ました。それが本当なら、なぜIntPtrを使用する必要があるのでしょうか。