2011-06-20 2 views
4

この関数を正しくP /呼び出しするにはどうすればよいですか?この関数を正しくP /呼び出しするには?

const char * GetReplyTo(const char * pszInText, char * pszOutText, int len) 

私はこのようにそれを実行しようとしましたし、アクセス違反の例外を持っている:

[DllImport("SmartBot.dll", EntryPoint = "GetReplyTo")] 
public static extern IntPtr GetReplyTo([In] [MarshalAs(UnmanagedType.LPStr)] string pszInText, IntPtr pszOutText, int len); 

// somewhere below: 
IntPtr pbuf = GCHandle.Alloc(new byte[1000], GCHandleType.Pinned).AddrOfPinnedObject(); 
GetReplyTo("hi", pbuf, 2); 

UPDATEはここ は、このファイルのパスカルヘッダーです:

{*************************************************************************** 
* SmartBot Engine - Boltun source code, 
* SmartBot Engine Dynamic Link Library 
* 
* Copyright (c) 2003 ProVirus, 
* Created Alexander Kiselev Voronezh, Russia 
*************************************************************************** 
SmartBot.pas : Header Pascal for SmartBot Engine. 
} 

unit SmartBot; 

interface 

{ 
function GetReplyTo(const InText: PChar; OutText: PChar; Len: integer): PChar;stdcall;export; 
function LoadMind(MindFile: PChar): integer;stdcall;export; 
function SaveMind(MindFile: PChar): integer;stdcall;export; 
} 
function GetReplyTo(const InText: PChar; OutText: PChar; Len: integer): PChar;stdcall;external 'smartbot.dll' name 'GetReplyTo'; 
function LoadMind(MindFile: PChar): integer;stdcall;external 'smartbot.dll' name 'LoadMind'; 
function SaveMind(MindFile: PChar): integer;stdcall;external 'smartbot.dll' name 'SaveMind'; 

implementation 
end. 

UPDATE 2それは動作します。私は初期化関数を使いこなすように見えます。成功すると1を返し、失敗した場合は0を返します。奇妙な。

+0

ご質問には情報が不十分です。特に、戻り値が指すデータの所有権について何も述べていません。 – CodesInChaos

+0

どちらか分かりません。私はちょうどdllをインポートしようとすると、デバッガを使用して正しく使用するfugure方法 – Poma

+0

戻り値は 'アウト'値と同じですか? – leppie

答えて

5

lenのサイズに初期化する二番目のパラメータのためのStringBuilderを使用する必要があります。あなたはあなた自身のためにあまりにも多くの仕事をしています。出力文字列パラメータの場合は、StringBuilderを使用してください。関数が文字あたり1バイトを使用するように見えるので、おそらくCharSetをP/Invoke宣言に指定する必要があります。また

[DllImport("SmartBot.dll", CharSet = CharSet.Ansi)] 
public static extern string GetReplyTo(string pszInText, 
    StringBuilder pszOutText, int len); 

var stringBuilder = new StringBuilder(1000); 
GetReplyTo("hi", stringBuilder, stringBuilder.Capacity); 

あなたが右の呼び出し規約(DllImport属性にCallingConventionプロパティ)を指定していることを確認してください。

+0

updated私の質問 – Poma

+1

戻り値がどのようなもので、どのようにマーシャリングするべきかは不明です。関数を宣言して、 'IntPtr'をpinvoke marshallerにそのまま残すように指示する手段として返します。 –

+0

呼び出し規則は正しく、両方ともstdcallです。 –

3

あなたはおそらくここIntPtrをしたくないあなたは

関連する問題