C#如何获取C++DLL中的函数名字

C#如何获取C++DLL中的函数名字,第1张

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的函数等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9744397.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-01
下一篇 2023-05-01

发表评论

登录后才能评论

评论列表(0条)

保存