none
P.Invoke问题(急) RRS feed

  • 问题

  •  

    环境:

    现有FetionCameraDLL.hFetionCameraDLL.libFetionCameraDLL.dll3个文件,

    其中的函数原形为:

    BOOL GetPhoto(WCHAR* pszFilePath);

     

    问题:我现在想用C#来调用这个函数,于是做了以下处理:

    [DllImport("FetionCameraDLLdd.dll")]
    public static extern Boolean GetPhoto(ushort[] file);

     

    public static bool Photo(string fileName) {
        bool ok = GetPhoto(ConvertToUshort(fileName));
             return ok;
        }

     

        static ushort[] ConvertToUshort(string str) {
            char[] chars = str.ToCharArray();
            ushort[] us = new ushort[chars.Length];
            for(int i = 0; i < us.Length; i++) {
                us = System.Convert.ToUInt16(chars);
            }
            return us;
        }

    同时我也将FetionCameraDLLdd.dll与程序放在同一文件夹下,可就是无法调用,总是提示:

     

    无法找到 PInvoke DLL“FetionCameraDLLdd.dll”。

     

    dll编写者说GetPhoto函数的参数可以为空(有个默认参数),于是我将所有参数列表置空,也还是出现同样的提示。

     

    帮助: 1 是我的这个dll存储位置不对吗?

    2 是我的这个参数类型不匹配吗?

    3 还是这个dll本身可能不正确,可dll编写者称其它人调用没有问题,会不会是应用环境的问题?

    4 如果有人知道,能否告诉下正确的调用方法。

    2008年9月27日 1:55

答案

  • WCHAR* 用String即可

     

    下面是一个很简单的测试程序,直接用Messagebox把你传入的path显示出来:

    C++ code:

    Code Snippet
    extern "C"
    __declspec(dllexport) bool GetPhoto(WCHAR* pszFilePath)
    {
     MessageBox(NULL,pszFilePath,pszFilePath,MB_OK);
     return true;
    }

     

     

    C# Code:

    Code Snippet

            static void Main(string[] args)
            {

               //这里用一个Messagebox看GetPhoto是否成功执行完毕
               System.Windows.Forms.MessageBox.Show(GetPhoto("\\testfilepath").ToString());
            }

     

            [DllImport("TestDll.dll", SetLastError = true)]
            static extern bool GetPhoto(string filepath);

     

     

    在WM5 PPC上测试成功

     

    Goodluck~

     

    黄季冬

    http://fox23.cnblogs.com

     

    2008年9月29日 3:56
    版主

全部回复

  •  

    确保调试的时候,该dll和你的程序集是在设备或者模拟器的同一个目录下,而不是PC的同一目录
    2008年9月27日 12:32
    版主
  •  

    这个我当然知道,我是放在设备上的程序集文件夹下面的,是不是我声明的函数参数有问题
    2008年9月28日 1:02
  • WCHAR* 用String即可

     

    下面是一个很简单的测试程序,直接用Messagebox把你传入的path显示出来:

    C++ code:

    Code Snippet
    extern "C"
    __declspec(dllexport) bool GetPhoto(WCHAR* pszFilePath)
    {
     MessageBox(NULL,pszFilePath,pszFilePath,MB_OK);
     return true;
    }

     

     

    C# Code:

    Code Snippet

            static void Main(string[] args)
            {

               //这里用一个Messagebox看GetPhoto是否成功执行完毕
               System.Windows.Forms.MessageBox.Show(GetPhoto("\\testfilepath").ToString());
            }

     

            [DllImport("TestDll.dll", SetLastError = true)]
            static extern bool GetPhoto(string filepath);

     

     

    在WM5 PPC上测试成功

     

    Goodluck~

     

    黄季冬

    http://fox23.cnblogs.com

     

    2008年9月29日 3:56
    版主