CHAR 可以先实例化一个StringBuilder然后可以传给char类型
关于其他的请参考msdn中的c++与c#的类型转换
对应关系如下:
C++ ---- C#
传入的char ----string
传出的char ---- StringBuilder(预分配空间)
short ----short
char ---- byte
char[n] ---- fixed byte[n]
结构指针 ----结构指针
函数指针 ---- 委托
里面涉及到函数指针,在C#里面用委托替代,总的代码如下:
delegate int pfunc(void dst,void src,int nSize);
unsafe public struct MyStruct
{
public Byte pMemory;//也可以用unsinged int替代(uint)
public pfunc myfunc;//这里用委托替代函数指针
public char[] rd;//声明的时候不能指定大小,可以在new的时候指定大小
}
对函数的声明,需要放到窗体的local external functions里,如果在多个窗体里用到,可以放在全局声明,即global external functions
Function ulong FindWindowA(string lpClassName,string lpWindowName) library 'user32dll'
////function long FindWindowExA(long ParentWnd, long ChildWnd,string ClassName,string WindowName) library 'user32dll'
在 DLL工程中的 cpp中函数定义如下:
extern "C" _declspec (dllexport )
int add(int a, char b)
{
return a + b;
}
一:显示链接
调用的 DLL的主工程的 main文件中代码如下:
#include <stdioh>
#include <Windowsh>
#include <tcharh>
int main()
{
HMODULE hModule = NULL;
typedef int (Func)(int a, int b);
// 动态加载 DLL 文件
hModule = LoadLibrary(_TEXT("//Debug//FuncDlldll" ));
// 获取 add 函数地址
Func fAdd = (Func)GetProcAddress(hModule, "add" );
// 使用函数指针
printf("%d/n" , fAdd(5, 2));
// 最后记得要释放指针
FreeLibrary(hModule);
return 0;
}
二:隐式链接:
调用的 DLL的主工程的 main文件中代码如下:
#include <stdioh>
#include <Windowsh>
#include <tcharh>
// 先把 lib 链接进来
#pragma comment (lib , "//Debug//FuncDlllib" )
// 外部声明的 add 函数
extern "C" _declspec (dllimport )
int add(int a, char b);
int main()
{
// 直接调用 add 函数
printf("%d/n" , add(5, 2));
return 0;
}
Cython将Python文件转为c文件。
在调用DLL之前,最好先建立另一个空项目将pchcpp里面的代码复制过去测试一下直接调用listAdd函数能不能成功。
新建空项目,将生成dll和lib文件以及原Python文件test_numpypy复制到新项目的路径下,新建maincpp,用于调用dll,运行之前,需要配置一下项目属性,将之前生成的lib文件加入到链接器里面,再运行程序。
声明外部函数,//初始化日控件
function boolean InitCommonControlsEx(ref initcommoncontrols lpinitcommoncontrols) library "comctl32dll"
//清除指定的窗口及它的所有子窗口
function boolean DestroyWindow(ulong hwnd) library "user32"
//判断一个窗口句柄是否有效
function boolean IsWindow(ulong hwnd) library "user32"
//发送指定的信息(这里指时间结构)到指定的窗口
function long SendMessageSystemTime(long hwnd,long uMsg,long wParam,ref systemTime lpst) library "user32" alias for "SendMessageA"
还需要定义两个结构和两个函数(一个设置日期,一个获取日期)
of_getdate()函数
//声明结构 对象
systemtime stc_systemtime;
//声明日期类型 引用
date dat_calendar;
if IsWindow(i_lng_handle) then //如果窗口句柄可用
//将用户选择的时间信息填充到时间结构中去,0表示成功,其它表示失败
if SendMessageSystemTime(i_lng_handle,4097,0,stc_systemtime)=0 then
//得到日期
dat_calendar=date(stc_systemtimewyear,stc_systemtimewmonth,stc_systemtimewday);
else
setNull(dat_calendar);
end if
else
setNull(dat_calendar);
end if
return dat_calendar;
//
of_setdate(long an_handle) 函数
//将可视日历控件的窗口句柄传递给不可视的用户对象,二者关联在一起,获得日期
if IsWindow(an_handle) then
if IsWindow(i_lng_handle) then DestroyWindow(i_lng_handle);//销毁以前的对象
//设置句柄
i_lng_handle=an_handle;
end if
return
//得到日历的时间(按钮中代码)
date dat_calendar;
string str_calendar;
dat_calendar=uo_1i_nvo_calendaruf_getdate();
if isNull(dat_calendar) then
str_calendar='未得到正确的日期';
else
str_calendar=string(dat_calendar,'yyyy-mm-dd');
end if
messageBox('日历',str_calendar);
在 PB 编译后的程序中使用 DLL,需要将 DLL 文件放到程序目录下。可以通过以下步骤实现:
1 找到编译后的可执行文件(通常是 exe 文件),并记住它所在的路径。
2 将需要使用的 DLL 文件复制到与可执行文件相同的目录中。
3 在 PB 代码中调用该 DLL 的函数或过程时,系统会自动搜索当前工作目录以查找所需的 DLL,并加载它们。
如果您想要确保应用程序始终能够找到所需的DLL,则可以考虑将其添加到系统环境变量 PATH 中。这样做可以使 *** 作系统在任何位置都能够找到该DLL,而不仅限于应用程序目录。
以上就是关于C#如何获取C++DLL中的函数名字全部的内容,包括:C#如何获取C++DLL中的函数名字、PB 如何调用一个dll 里的函数、如何调用DLL的函数等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)