在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
由于程序中设计到一些转序的方法(主机序和网络序之间的转换)所以要更换成windows平台下的转序方法,添加如下代码:
//windows转序
#include <stdlib.h> #include <winsock.h> #pragma comment(lib, "ws2_32.lib") 编译通过后放在C#工程的运行目录下执行,系统提示找不到相关函数的入口点,这个时候有点疑惑,在博客园的里搜了下,看到了一篇讲C#调用C++的DLL找不到入口函数的原因是因为,函数在便宜成DLL后函数的名称就发生了改变:会在函数的前后产生一些字符
[DllImport("PetCppTest.dll", EntryPoint = "WriteCommonHeader", CallingConvention = CallingConvention.StdCall)]
注:其中"WriteCommonHeader"就是原来C++里函数的名称,文章中提到可以用一个叫eXeScope的软件查出函数在编译后具体变成了什么名称,只要将这些名称输入完全就可以正确找到入口函数 最有意思的地方出现了,当我用eXeScope去查看我编译成功的DLL却惊奇的发现我的DLL没有导出函数,没有导出函数也就意味着就是神仙也调用不了..... 我被卡住了,由于对C++不熟悉,就只好又去搜资料,终于让我知道了如何定义导出函数,下面是个例子: 示例DLL和应用程序 这是一个在Visual C++中用“Win32动态链接库”项目类型创建的示例程序。
// myDLL.cpp
// #include "stdafx.h" #define EXPORTING_DLL #include "sampleDLL.h" BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) }
// File: myDLL.h
// #ifndef INDLL_H #define INDLL_H #ifdef EXPORTING_DLL extern __declspec(dllexport) void HelloWorld() ; #else extern __declspec(dllimport) void HelloWorld() ; #endif #endif 下面的程序是一个win32应用程序,该程序调用myDLL中的导出函数HelloWorld。
// myApp.cpp
// #include "stdafx.h" #include "myDLL.h" int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) } 看明白了吗 虽然是很简单的代码 却让我明白了要定义导出函数的方法: 1.首先要在头文件里定义方法: #ifdef EXPORTING_DLL extern __declspec(dllexport) void HelloWorld() ; #else extern __declspec(dllimport) void HelloWorld() ; #endif 2.其次在CPP文件里使用定义: #include "stdafx.h" #define EXPORTING_DLL #include "sampleDLL.h" OK 按找这样的方法我在头文件里也加入了相关方法的声明:
#ifndef ADOPTPROTOCOL_H
#define ADOPTPROTOCOL_H #include "AdoptDefine.h" #ifdef EXPORT_WRITECOMMONHEADER extern __declspec(dllexport) UINT32 WriteCommonHeader(UINT8 *pMemory, const CommonHeader &stCommonHeader) ; #else extern __declspec(dllimport) UINT32 WriteCommonHeader(UINT8 *pMemory, const CommonHeader &stCommonHeader) ; #endif typedef struct tag_CommonHeader CommonHeader; 然后在CPP文件里使用定义:
#include <stdio.h>
#include <string.h> //----------导出方法必须的----- #define EXPORT_WRITECOMMONHEADER //-------------------------------- //windows转序 #include <stdlib.h> #include <winsock.h>
//------------------------------------------
去掉CClientProtocol::以后 用eXeScope成功的看到了导出函数的名字 这个时候名字已经不再是WriteCommonHeader而是变成了?WriteCommonHeader@@YAIPAEABUtag_CommonHeader@@@Z//要想在产生导出函数必须去掉在头文件里的声明 //可以取消类的应用CClientProtocol:: //----------------------------------------- UINT32 CClientProtocol::WriteCommonHeader(UINT8 *pMemory, const CommonHeader &stCommonHeader) } 在C#的调用方更改了入口点函数的名字后调用成功:
[DllImport("PetCppTest.dll", EntryPoint = "?WriteCommonHeader@@YAIPAEABUtag_CommonHeader@@@Z", CallingConvention = CallingConvention.StdCall)]
public static extern UInt32 WriteCommonHeader(ref byte pMemory, ref byte[] CommonHeader); 下面是一个简单的调用方法的例子项目:
public struct CommonHeader
|
请发表评论