function GetVcell_Index(Devicechannum,IndexSs:Integer;var mV:widestring):Integer;stdcall;
  传递参数:Devicechannum: 通道号     (只有一个通道,这里可以传1)
            IndexSs:第几串
            mV:(回传值)                       
  返回参数:=0 表明不成功
            =1 表明成功这是他的调用函数,那么我C#调用该如何调用,因为这个包含了2个返回值,就蒙了。。
C#大致应该如下吧?
     [DllImport("UserDll.dll", CallingConvention = CallingConvention.StdCall)]
     //   public static extern int GetVcell_Index(string OrignStr, string Key, int NewStr);
以上仅供参考,能力有限,还请大虾帮忙!

解决方案 »

  1.   

     public static extern int GetVcell_Index(int Devicechannum,int IndexSs,ref string mV);
    试试
      

  2.   

    话说一种语言去调用一种语言是很苦难的事情
    所以才有COM  COM+  到现在.NET可以试试楼上的
      

  3.   


    谢谢回答,ref属于返回的话应该就是那么定义,那么我该如何去读取返回值?在我的函数里面
    比如:Val = GetVcell_Index(1,1,????);
      

  4.   

    因为还没法接上设备仿真,只是进行了调用对方的DLL,出现了以下错误
    无法加载 DLL“UserDll.dll”: 动态链接库(DLL)初始化例程失败。 (异常来自 HRESULT:0x8007045A)。
    这个错误是来自于我程序本身,还是没有跟对方进行设备连接才会产生的。
      

  5.   

    public static extern int GetVcell_Index(int Devicechannum,int IndexSs,ref string mV);string mV = "";
    int Val = 0;
    Val = GetVcell_Index(1,1,ref mV);Val是返回值
      

  6.   


    UserDll.dll文件是否存在或路径是否正确!
      

  7.   

    对于你的疑问我测试了下,假如路径不正确,会直接抛出此错误,但是路径正确的话,会先提示:
    Form1:xxxx.vshost.exe -应用程序错误
       未知的软件异常(0x0eedfade),位置为0x7c812afb.
    点击确定跳出 Runtime error 217 at 09822dd5.
    再点击确认才抛出:
    无法加载 DLL“UserDll.dll”: 动态链接库(DLL)初始化例程失败。 (异常来自 HRESULT:0x8007045A)。
      

  8.   

    请教!
    Val是个返回值没错,但是mV也是个返回值,我该如何获取到Val和mV,2个返回值?
      

  9.   

    求教大虾!
    假如对方给DLL增加了点小动作的话,是不是我这种语句就会失败??
    已经按照上述的去做了,但是每次都是抛出未知的软件异常,然后确定完了提示加载失败!!
      

  10.   

    UPUP。
    仍然无法解决问题,个人怀疑是不是Delphi封装的DLL增加了初始化的限定,导致C#调用时候就抛出
    Form1:xxxx.vshost.exe -应用程序错误
      未知的软件异常(0x0eedfade),位置为0x7c812afb.
    这种匪夷所思的错误,点击确认才再抛出:动态链接库(DLL)初始化例程失败(这是经历了2次错误才出来的)假如刻意把封装转移位置,该错误就不再出现,只是提示
     无法加载 DLL“UserDll.dll”: 动态链接库(DLL)初始化例程失败 (这DLL不存在提示这是正确的)
      

  11.   

    动态库被初始化时会执行自有的处理,如果此处理中依赖与其它的动态链接库,或者设备驱动程序,就会出现楼主所说的问题,如果dll只使用了单纯的静态链接,可以使用PEBrowse或者其它的pe工具,检查下导入函数表中依赖了哪些dll
      

  12.   

    to zhu_jiang
    个人感觉是那样,错误里还含有一个runtime error at 217 09822dd5 这个错误。
    感觉就是非法调用了此dll引发了系统错误。确认是对方dll有特殊处理的话可能问题就好解决多了。
      

  13.   

    楼主可以使用loadlibrary去加载该动态链接库
    如果加载都失败,那就容易判断问题了
      

  14.   


    C#内用loadlibrary去加载?
    如何实现?
    还请帮忙给个例子,谢谢!
      

  15.   


    public delegate int FARPROC();[System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]
    public struct HINSTANCE__ {
        
        /// int
        public int unused;
    }public partial class NativeMethods {
        
        /// Return Type: HMODULE->HINSTANCE->HINSTANCE__*
        ///lpFileName: LPCTSTR->LPCWSTR->WCHAR*
        [System.Runtime.InteropServices.DllImportAttribute("kernel32.dll", EntryPoint="LoadLibraryW")]
    public static extern  System.IntPtr LoadLibraryW([System.Runtime.InteropServices.InAttribute()] [System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.LPTStr)] string lpFileName) ;    
        /// Return Type: FARPROC
        ///hModule: HMODULE->HINSTANCE->HINSTANCE__*
        ///lpProcName: LPCSTR->CHAR*
        [System.Runtime.InteropServices.DllImportAttribute("kernel32.dll", EntryPoint="GetProcAddress")]
    public static extern  FARPROC GetProcAddress([System.Runtime.InteropServices.InAttribute()] System.IntPtr hModule, [System.Runtime.InteropServices.InAttribute()] [System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.LPStr)] string lpProcName) ;}
      

  16.   

    解决问题。是对方dll的问题。他调用了一个ini文件。关键还在于他调用的ini文件还是对不上的,才产生了Runtime error的错误。
    1楼的方法解决了2个返回值的问题。OVER