项目笔记:
C#调用C++的dll
C#语法:
将 c++的dll slpapi62.dll 放在 项目/bin目录下,保证项目可以访问到它
Demo:
[DllImport("slpapi62", EntryPoint = "_SlpOpenPrinter@12", SetLastError = false)]
public static extern int SlpOpenPrinter(string strPrinterName, int nID, bool fPortrait);
关于详细dllImport的参数,可以参考msdn
一开始将setLastError 设置为true,导致得不到错误信息。错误信息被下一步正确的信息覆盖。
一般要调用的api 同时会提供公开文档,供调用者调用。提供入口和相关的参数。
好的api文档会给出不同版本的demo项目。所以得到项目的sdk会提供很好的方便
也可以使用工具:Dependency Walker. VC++的一款绿色软件,可以查看到入口点,非常的好用。
Notice:
关于字符串的附值方法:
项目中遇到一种清况,使用string 的参数类别,确可以在方法中对string 付值,类似于ref关键字
[DllImport("slpapi62", EntryPoint = "_SlpGetPrinterName@12", SetLastError = false)]
public static extern int SlpGetPrinterName(string strPrinterName);
调用:
string s=string.Empty;
int ret =SLPUnManagerMethod(s);
在方法SlpGetPrinterName中的s改变,并且要保持,然而在C#的语法中,这显然是不可能的,除非添加 ref/out 关键字
可以考虑使用的别方法:(项目实际使用)
[DllImport("slpapi62", EntryPoint = "_SlpGetPrinterName@12", SetLastError = false)]
public static extern int SlpGetPrinterName(StringBulider strPrinterName);
返回string的2种方式:
public class App
{
public static void Main()
{
// Call GetSystemDirectory.
StringBuilder sysDirBuffer = new StringBuilder( 256 );
LibWrap.GetSystemDirectory( sysDirBuffer, sysDirBuffer.Capacity );
…
// Call GetCommandLine.
IntPtr cmdLineStr = LibWrap.GetCommandLine();
String commandLine = Marshal.PtrToStringAuto( cmdLineStr );
}
}