木曜日, 4月 13, 2006

[C#][Win32][API][DLL] C++(or C)のDLLから関数を呼びだす

□基本

@IT:.NET TIPS Win32 APIやDLL関数を呼び出すには? - C#
http://www.atmarkit.co.jp/fdotnet/dotnettips/024w32api/w32api.html

@IT:.NET TIPS Win32 APIやDLL関数に文字列や文字列バッファを渡すには? - C#
http://www.atmarkit.co.jp/fdotnet/dotnettips/025w32string/w32string.html

□参考
VC6.0で作成したDLLのWebアプリケーションでの実装方法 - Insider.NET
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=24168&forum=7

□構造体を使う時

文字列を扱うWindows API関数の使い方
http://members.jcom.home.ne.jp/1213687801/cs/com/api3.html
CSharp Code Source(正確なサイト名不明)


□配列を渡す時
受け取る側(DLL)が、配列と認識しているならばよいが、
そうでない場合は、無理やりキャストする。

object [] outPara = new object [3];
object outParaObj = (object)outPara;


□Outパラメータ(ref out)
DLLの宣言の部分でも、「ref」や「out」をつけて宣言する。
#もちろん呼び出される側で、そーゆー実装をしている事が前提。

[DllImport(aaa.dll)]
static extern int Action(
[MarshalAs(UnmanagedType.Struct)]object inPara;
[MarshalAs(UnmanagedType.Struct)]ref object refPara;
[MarshalAs(UnmanagedType.Struct)]out object outPara;
)

関数を使うところも「ref」と「out」をつけて使う。

int result = Action(
inPara
,ref refPara
,out outPara
);


□真偽値の条件文
C#ではtrueが「1」だが、Cでは0でない値はすべてtrue。
受け取り側の条件文を誤るとtrueで渡しても受け取ってもらえなかったり。

例) C側の条件文
正解
if (flag)
if (flag != VARIANT_FALSE)

不正解
if (flag == TRUE)
if (flag == VARIANT_TRUE)


□型の話
C#側で渡した型が、C側でどのように受け取られるか。
#あやふやな部分

string VT_BSTR
int VT_I4
bool VT_BOOL
object variant

0 件のコメント: