C#2005 调用evc 生成的Dll 的问题求助

iqtao   2008-12-30 20:33 楼主
大家好!我在设计一个程序,用在ARM+ DSP的设备上的,要使用API函数的。在C# 里面写成的程序运行发现DSP很容易死机。所以没有办法,只能用原来evc写的(我大部分的程序都是C# 2005写的)。所以我想把EVC的那些代码编成DLL。然后再C# 里调用这个dll,这样所有的问题都解决了。(不知道这个想法可行否?)
这段时间,我找到一些资料,也做了一些工作。有个dll我可以用VS2003 C#调用了。(在智能设备上可以,在Windows模式下出问题,真搞不明白!!)但是在C# 2005我都做不成功。(在2003成功了,在2005应该没有问题了吧!)
下面我把代码写出来。大家给我分析分析:
ShowParam.dll 中.cpp的代码

  1. #include "stdafx.h"
  2. #include "showparam.h"

  3. LPWSTR pLibName = L"ShowParam - Win32 DLL";
  4. BOOL APIENTRY
  5. DllMain( HANDLE hModule,
  6.          DWORD  ul_reason_for_call,
  7.          LPVOID lpReserved)
  8. {
  9.     return TRUE;
  10. }
  11. //
  12. // ShowInt32ByVal - 显示传Int32的值
  13. //
  14. extern "C"  __declspec ( dllexport )
  15. void WINAPI ShowInt32ByVal(LONG val)
  16. {
  17.     WCHAR wch[128];
  18.     wsprintf(wch, L"ShowInt32ByVal = %d", val);
  19.     MessageBoxW(NULL, wch, pLibName, 0);
  20. }

  21. //
  22. // ShowBooleanByRef - 显示传应用的boolean的值
  23. //
  24. extern "C" __declspec ( dllexport )
  25. void WINAPI ShowBooleanByRef(BYTE * val)
  26. {
  27.     WCHAR wch[128];
  28.     wsprintf(wch, L"BoolByRef = %d", *val);
  29.     MessageBoxW(NULL, wch, pLibName, 0);
  30. }

  31. //
  32. // ShowByteByVal - 显示传值的byte的值
  33. //
  34. extern "C" __declspec ( dllexport )
  35. void WINAPI ShowByteByVal(BYTE val)
  36. {
  37.     WCHAR wch[128];
  38.     wsprintf(wch, L"ShowByteByVal = %d", val);
  39.     MessageBoxW(NULL, wch, pLibName, 0);
  40. }
  41. ……
  42. // 下面都是类似的代码还有

dll 头文件的代码

  1. extern "C" __declspec ( dllexport ) void WINAPI ShowBooleanByVal(BYTE b);
  2. extern "C" __declspec ( dllexport ) void WINAPI ShowBooleanByRef(BYTE * b);
  3. extern "C" __declspec ( dllexport ) void WINAPI ShowByteByVal(BYTE val);
  4. extern "C" __declspec ( dllexport ) void WINAPI ShowByteByRef(BYTE * val);
  5. ……


以上就是dll文件的代码。
下面是vs2003C#智能模式使用这个dll,没有问题。
代码:

  1. //一个调用的类
  2. using System;
  3. using System.Text;
  4. using System.Windows.Forms;
  5. using System.Runtime.InteropServices;
  6. CallWin32 Class
  7. {
  8. public const string DllName = "ShowParam.dll";

  9.                 [DllImport(DllName, CharSet=CharSet.Unicode)]
  10.                 public static extern void ShowBooleanByVal (Boolean b);
  11.                 [DllImport(DllName, CharSet=CharSet.Unicode)]
  12.                 public static extern void ShowBooleanByRef (ref Boolean b);
  13.                 [DllImport(DllName, CharSet=CharSet.Unicode)]
  14.                 public static extern void ShowByteByVal (Byte val);
  15.                 [DllImport(DllName, CharSet=CharSet.Unicode)]
  16.                 public static extern void ShowByteByRef (ref Byte val);
  17. ……
  18. }
  19.         public static void
  20.                         CallWin32Lib(String strVal, String strType, Boolean bByRef)
  21.                 {     if (strType == "Int16")
  22.                         {
  23.                                 Int16 shVal = Int16.Parse(strVal);
  24.                                 if (bByRef)
  25.                                 {
  26.                                         ShowInt16ByRef(ref shVal);
  27.                                 }
  28.                                 else
  29.                                 {
  30.                                         ShowInt16ByVal(shVal);
  31.                                 }
  32.                         }
  33. ……

  34. }

  35. // 通过按钮就运行调用程序:
  36. public class Form1 : System.Windows.Forms.Form
  37.         {
  38. public const string strApp = "CallWin32";
  39. private void button1_Click(object sender, System.EventArgs e)
  40.                 {
  41. string strType = "Char";
  42.                         string strVal  = "hello";
  43. //
  44. //                        string strType = "Int32";
  45. //                        string strVal  = "1110";
  46.                         Boolean bByRef = false;
  47.             CallWin32.CallWin32Lib(strVal, strType, bByRef);
  48. }
  49. }


在2003 2005 我在解决方案里面都添加了对dll文件的引用。
但是同样的代码。在vs2005上就出现了问题了。
大家知道哪里出问题了吗?
问题的显示:
无法加载 DLL“ShowParam.dll”: 找不到指定的模块。 (异常来自 HRESULT:0x8007007E)


回复评论 (6)

[url=http:// http://www.ziddu.com/download/3054165/TestEvcDll.rar.html][/url]
我的文件!
希望了解的朋友多多发言啊!
先谢了
祝大家新年发财!
年终高高高!
点赞  2008-12-30 21:23
这个和VS2003和2005没有什么关系。DllMain( HANDLE hModule,
         DWORD  ul_reason_for_call,
         LPVOID lpReserved)
{
    return TRUE;
}
都RETURN TURE对吗?另外不行用DEF文件导出吧。
点赞  2008-12-31 09:01
是的啊!都是return!
我也觉得奇怪啊!就是出问题啊。
楼上什么意思,用def文件导出!???
点赞  2008-12-31 10:02
平时那个dll路径要放在什么地方的啊!
点赞  2009-1-1 13:18
up
点赞  2009-1-3 22:12
自己问题已经解决!
主要是DLL的问题。原来在用的是evc下,模拟器生成的Dll,在vs2005模拟器就不能用了!
现在通过evc在arm环境下生成dll,一切问题解决了。
这个也说明了。evc生成的dll完全可以在vc2005 C#环境使用
点赞  2009-1-6 12:48
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复