2011-06-20 30 views
4

如何正確P /調用此功能?如何正確地P/Invoke這個功能?

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 下面是該文件的Pascal頭:

{*************************************************************************** 
* 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,然後將如何使用調試器正確使用它 – Poma

+0

返回值是否與'out'值相同? – leppie

回答

5

第二個參數,您可能不希望的IntPtr這裏。你爲自己做了太多工作。對於輸出字符串參數,應該使用StringBuilder。您可能需要在您的P/Invoke聲明中指定CharSet,因爲該函數似乎每個字符使用一個字節。

[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

已更新我的問題 – Poma

+1

不清楚返回值是什麼以及它應該如何編組由於它似乎沒有被使用,我寧願聲明該函數返回'IntPtr'作爲一種手段,告訴pinvoke編組讓其獨立。 –

+0

調用約定是正確的,兩者都是stdcall。 –

3

你應該使用StringBuilder爲您初始化大小LEN