NI LabVIEW,CVI,数据采集等产品讨论区

取消
显示结果 
搜索替代 
您的意思是: 

cvi调用VC++的DLL

已解决!
转到解答

我用cvi做一个小程序,需要用到并口,公司以前的程序是VC++的,里面的dll调用方式有两种,头文件如下:

#ifndef WINIO_H

#define WINIO_H

#include "windef.h"

//#include "winnt.h"

 

#ifdef WINIO_DLL

#define WINIO_API _declspec(dllexport)

#else

#define WINIO_API _declspec(dllimport)

#endif

 

extern "C"

{

  WINIO_API bool _stdcall InitializeWinIo();

  WINIO_API void _stdcall ShutdownWinIo();

  WINIO_API PBYTE _stdcall MapPhysToLin(PBYTE pbPhysAddr, DWORD dwPhysSize, HANDLE *pPhysicalMemoryHandle);

  WINIO_API bool _stdcall UnmapPhysicalMemory(HANDLE PhysicalMemoryHandle, PBYTE pbLinAddr);

  WINIO_API bool _stdcall GetPhysLong(PBYTE pbPhysAddr, PDWORD pdwPhysVal);

  WINIO_API bool _stdcall SetPhysLong(PBYTE pbPhysAddr, DWORD dwPhysVal);

  WINIO_API bool _stdcall GetPortVal(WORD wPortAddr, PDWORD pdwPortVal, BYTE bSize);

  WINIO_API bool _stdcall SetPortVal(WORD wPortAddr, DWORD dwPortVal, BYTE bSize);

  WINIO_API bool _stdcall InstallWinIoDriver(PSTR pszWinIoDriverPath, bool IsDemandLoaded = false);

  WINIO_API bool _stdcall RemoveWinIoDriver();

}

 

extern bool IsNT;

extern HANDLE hDriver;

extern bool IsWinIoInitialized;

 

bool _stdcall StartWinIoDriver();

bool _stdcall StopWinIoDriver();

 

 

#endif

 

 我加入文件编译没通过!!

我可以在cvi中直接调用么?

有什么要注意的么? 

0 项奖励
1 条消息(共 19 条)
12,193 次查看
有人用过类似的东西么?
0 项奖励
2 条消息(共 19 条)
12,169 次查看

看了你的问题,你将winio的头文件贴上了.如果要使用他可以使用VC制作dll来调用winio.dll 或 更改winio.h头文件 或 添加window.h等头文件.来实现.

 

3 条消息(共 19 条)
12,129 次查看

我已经有WinIo.dll和相应的WinIo.lib,而且头文件也写好了,上层函数的调用也是这里面的函数,我在主程序里调用InitializeWinIo();  ShutdownWinIo();结果出错,Missing prototype. if(InitializeWinIo())。 

我把头文件修改过:

#ifndef WINIO_H
#define WINIO_H
#include "windef.h"
//#include "winnt.h"
#define bool BOOL
#define false 0
#define true  1
#ifdef WINIO_DLL
#define WINIO_API _declspec(dllexport)
#else
#define WINIO_API _declspec(dllimport)
#endif


   bool _stdcall InitializeWinIo();
   void _stdcall ShutdownWinIo();
   _stdcall MapPhysToLin(PBYTE pbPhysAddr, DWORD dwPhysSize, HANDLE *pPhysicalMemoryHandle);
   bool _stdcall UnmapPhysicalMemory(HANDLE PhysicalMemoryHandle, PBYTE pbLinAddr);
   bool _stdcall GetPhysLong(PBYTE pbPhysAddr, PDWORD pdwPhysVal);
   bool _stdcall SetPhysLong(PBYTE pbPhysAddr, DWORD dwPhysVal);
   bool _stdcall GetPortVal(WORD wPortAddr, PDWORD pdwPortVal, BYTE bSize);
   bool _stdcall SetPortVal(WORD wPortAddr, DWORD dwPortVal, BYTE bSize);
   bool _stdcall InstallWinIoDriver(PSTR pszWinIoDriverPath, bool IsDemandLoaded );
   bool _stdcall RemoveWinIoDriver();
#endif
 

可还是一样的错误,
    Missing prototype.

难道不可以直接调用么?是不是那里设置的不对?

0 项奖励
4 条消息(共 19 条)
12,122 次查看

Missing prototype. if(InitializeWinIo())

这个错误标识程序无法找到或调用到InitializeWinIo()这个函数.

5 条消息(共 19 条)
12,119 次查看

Missing prototype. if(InitializeWinIo())

这个错误标识程序无法找到或调用到InitializeWinIo()这个函数.

 

-------------------------------------------------------------------------------

这个我知道,我以前也在cvi里吊用过dll,只要有相应的lib文件和*.h文件函数就可以正确调用,但是这个dll我已经在主文件里加入了头文件,而且也作了头文件函数声明 ,但是还是有上面的错误,我就是这里不理解,函数在VC++里调用没问题的,在cvi里应该可以正常调用的,所以我认为是环境的设置哪里有问题,所以问问有没有人做过这样的例子,帮忙分析一下。

0 项奖励
6 条消息(共 19 条)
12,103 次查看

哪你可以设置一下cvi的环境,Options > build options  > Default calling convention: __stdcall

7 条消息(共 19 条)
12,101 次查看
这个我也改过,可是不管用阿,编译不通过!
0 项奖励
8 条消息(共 19 条)
12,077 次查看
winio 我试过了,在cvi中使用是不太好用.推荐你将你需要的函数使用VC封装一下就可以了.
9 条消息(共 19 条)
12,075 次查看
昨天  我包装了新的LtpIo.dll并且在VC下调用正常,还是要用到WinIo.dll     WinIo.sys   WinIo.VXD三个文件,但是新的dll在CVI下还是无法调用,我只是把  WinIo.sys   and   WinIo.VXD一并拷贝到工程目录下,不知道这样的处理是不是不对啊?CVI和VC的编译过程和原理是不是不同啊?到底如何设置才能通过呢?
0 项奖励
10 条消息(共 19 条)
12,054 次查看