大家好!我在设计一个程序,用在ARM+ DSP的设备上的,要使用API函数的。在C# 里面写成的程序运行发现DSP很容易死机。所以没有办法,只能用原来evc写的(我大部分的程序都是C# 2005写的)。所以我想把EVC的那些代码编成DLL。然后再C# 里调用这个dll,这样所有的问题都解决了。(不知道这个想法可行否?)
这段时间,我找到一些资料,也做了一些工作。有个dll我可以用VS2003 C#调用了。(在智能设备上可以,在Windows模式下出问题,真搞不明白!!)但是在C# 2005我都做不成功。(在2003成功了,在2005应该没有问题了吧!)
下面我把代码写出来。大家给我分析分析:
ShowParam.dll 中.cpp的代码
- #include "stdafx.h"
- #include "showparam.h"
- LPWSTR pLibName = L"ShowParam - Win32 DLL";
- BOOL APIENTRY
- DllMain( HANDLE hModule,
- DWORD ul_reason_for_call,
- LPVOID lpReserved)
- {
- return TRUE;
- }
- //
- // ShowInt32ByVal - 显示传Int32的值
- //
- extern "C" __declspec ( dllexport )
- void WINAPI ShowInt32ByVal(LONG val)
- {
- WCHAR wch[128];
- wsprintf(wch, L"ShowInt32ByVal = %d", val);
- MessageBoxW(NULL, wch, pLibName, 0);
- }
- //
- // ShowBooleanByRef - 显示传应用的boolean的值
- //
- extern "C" __declspec ( dllexport )
- void WINAPI ShowBooleanByRef(BYTE * val)
- {
- WCHAR wch[128];
- wsprintf(wch, L"BoolByRef = %d", *val);
- MessageBoxW(NULL, wch, pLibName, 0);
- }
- //
- // ShowByteByVal - 显示传值的byte的值
- //
- extern "C" __declspec ( dllexport )
- void WINAPI ShowByteByVal(BYTE val)
- {
- WCHAR wch[128];
- wsprintf(wch, L"ShowByteByVal = %d", val);
- MessageBoxW(NULL, wch, pLibName, 0);
- }
- ……
- // 下面都是类似的代码还有
dll 头文件的代码
- extern "C" __declspec ( dllexport ) void WINAPI ShowBooleanByVal(BYTE b);
- extern "C" __declspec ( dllexport ) void WINAPI ShowBooleanByRef(BYTE * b);
- extern "C" __declspec ( dllexport ) void WINAPI ShowByteByVal(BYTE val);
- extern "C" __declspec ( dllexport ) void WINAPI ShowByteByRef(BYTE * val);
- ……
以上就是dll文件的代码。
下面是vs2003C#智能模式使用这个dll,没有问题。
代码:
- //一个调用的类
- using System;
- using System.Text;
- using System.Windows.Forms;
- using System.Runtime.InteropServices;
- CallWin32 Class
- {
- public const string DllName = "ShowParam.dll";
- [DllImport(DllName, CharSet=CharSet.Unicode)]
- public static extern void ShowBooleanByVal (Boolean b);
- [DllImport(DllName, CharSet=CharSet.Unicode)]
- public static extern void ShowBooleanByRef (ref Boolean b);
- [DllImport(DllName, CharSet=CharSet.Unicode)]
- public static extern void ShowByteByVal (Byte val);
- [DllImport(DllName, CharSet=CharSet.Unicode)]
- public static extern void ShowByteByRef (ref Byte val);
- ……
- }
- public static void
- CallWin32Lib(String strVal, String strType, Boolean bByRef)
- { if (strType == "Int16")
- {
- Int16 shVal = Int16.Parse(strVal);
- if (bByRef)
- {
- ShowInt16ByRef(ref shVal);
- }
- else
- {
- ShowInt16ByVal(shVal);
- }
- }
- ……
- }
- // 通过按钮就运行调用程序:
- public class Form1 : System.Windows.Forms.Form
- {
- public const string strApp = "CallWin32";
- private void button1_Click(object sender, System.EventArgs e)
- {
- string strType = "Char";
- string strVal = "hello";
- //
- // string strType = "Int32";
- // string strVal = "1110";
- Boolean bByRef = false;
- CallWin32.CallWin32Lib(strVal, strType, bByRef);
- }
- }
在2003 2005 我在解决方案里面都添加了对dll文件的引用。
但是同样的代码。在vs2005上就出现了问题了。
大家知道哪里出问题了吗?
问题的显示:
无法加载 DLL“ShowParam.dll”: 找不到指定的模块。 (异常来自 HRESULT:0x8007007E)