[50分]C#调用dll文件中的函数的问题

ApiToSharp 2007-11-14 08:04:48
dll中的函数,是不是除了api以外,还有com?
例如shell.dll中的filerun()函数(无参数)
我用调用api函数的格式写,编译没问题,但运行时出现异常,说格式不正确

该怎么调用呢?(麻烦把命名空间,声明等都写出来)

注:js中是这样的new ActiveXObject("shell.application").filerun()
...全文
325 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
icemangd 2008-05-07
  • 打赏
  • 举报
回复
我也遇到了一个 这方面的问题 就是 用 web service 调用 dll 请问 这方面的有没有说明 或者谁知道怎么用!!
曲滨_銘龘鶽 2007-11-22
  • 打赏
  • 举报
回复
首先这两种方法我都测试过了、应该不会出问题。


第一种方法可行,不过有个问题:

我用调用api的方式,
使用shell32.dll提示找不到名为FileRun的入口点
使用shell.dll提示格式不正确

这说明FileRun函数存在于shell.dll中,而不是shell32.dll
这里为什么添加shell32.dll的引用?


答:win32 系统都是用 shell32.dll 你的操作时调用运行对话框,shell.dll win98 后就被废弃了
而且你调用的是com函数,当然是要引用com dll 的,因为你题中给的调用方式根本就是调用的com 而不是 api 方式

而且 FileRun 是一个 windows com api,windows api 不是叫这个名字是一个隐藏api 61api 号不知道现在变了没


===============================
第二种方法
object oShell = Activator.CreateInstance(tShell)处发生异常(值不能为空)


答:

//通过 ProgID 取得 com 对象类型
Type tShell =Type.GetTypeFromProgID( "Shell.Application ");

//实列对象
object oShell = Activator.CreateInstance(tShell);

如果 tShell 为空证明你的系统的 com 注册表有问题(番茄花园版本有这问题),这个对象在任何系统都应该存在
我很多年前用过好多次了、
==================================================================================

还有,第一种光是一个exe无法运行,必须要拷贝dll
可不可以把dll嵌入到exe
至少形式上只有一个exe就可以执行




或者不嵌入也行,直接引用%windir%\system32中的shell32.dll而不是要重新生成一个dll

太感谢你了,麻烦把我说的各种情况都解释一下

再次致谢

答:那个dll就是一个桥负责 com 到 .net ,的转换本身没有任何意义、如果不想带dll,还是用第二方式比较好而且我认为第二种出错、第一种也不好使。

如果坠入那个引用过来的dll 可以放到资源里,如果是vs2005很方便,在main函数里写出去就好用了
============================================================================
ApiToSharp 2007-11-16
  • 打赏
  • 举报
回复
麻烦哪些高人回答一下我在3,4,5楼提出的问题,谢谢了
wdzr_826 2007-11-15
  • 打赏
  • 举报
回复
1楼说的全,直接引用,或是反射
ptpa 2007-11-15
  • 打赏
  • 举报
回复
xuele
chxljtt 2007-11-15
  • 打赏
  • 举报
回复
我想这个应该讲的很详细!
http://blog.csdn.net/pansiom/archive/2006/01/01/568096.aspx
ApiToSharp 2007-11-15
  • 打赏
  • 举报
回复
或者不嵌入也行,直接引用%windir%\system32中的shell32.dll而不是要重新生成一个dll

太感谢你了,麻烦把我说的各种情况都解释一下

再次致谢
ApiToSharp 2007-11-15
  • 打赏
  • 举报
回复
还有,第一种光是一个exe无法运行,必须要拷贝dll
可不可以把dll嵌入到exe
至少形式上只有一个exe就可以执行
ApiToSharp 2007-11-15
  • 打赏
  • 举报
回复
谢谢

第一种方法可行,不过有个问题:

我用调用api的方式,
使用shell32.dll提示找不到名为FileRun的入口点
使用shell.dll提示格式不正确

这说明FileRun函数存在于shell.dll中,而不是shell32.dll
这里为什么添加shell32.dll的引用?


第二种方法
object oShell = Activator.CreateInstance(tShell)处发生异常(值不能为空)
曲滨_銘龘鶽 2007-11-14
  • 打赏
  • 举报
回复
不要忘记
using System.Reflection;
曲滨_銘龘鶽 2007-11-14
  • 打赏
  • 举报
回复
============= 1,直接添加引用 %windir%\system32\Shell32.dll ========
写代码
Shell32.ShellClass sc = new Shell32.ShellClass();
sc.FileRun();

============== 2,不用添加任何引用直接用反射 =========================

//通过 ProgID 取得 com 对象类型
Type tShell =Type.GetTypeFromProgID("Shell.Application");

//实列对象
object oShell = Activator.CreateInstance(tShell);

//反射调用
tShell.InvokeMember("FileRun"
, BindingFlags.InvokeMethod | BindingFlags.Default
, null
, oShell
, null //如果有参数在这里 new object[]{参数一,参数二,参数三,....}
);

//释放对象
System.Runtime.InteropServices.Marshal.ReleaseComObject(oShell);

110,545

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧