如何调用非托管的dll

项目笔记:

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 );
   }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值