Win32 DLL学习笔记

PB9调用dll的时候问题比较怪异,同样的代码在xp下面使用vs2010编译就可以了。
在win7下面使用vs2015编译出来就不行。注:已经设置支持xp了。

使用def导出接口

Module-Definition File (.def)

VERSION major[.minor]

LIBRARY "dllName"

EXPORTS
merchantBind @1

引用DLL

静态方式

#include "..\\xxx\xxx.h"

#ifdef _DEBUG
#pragma comment( lib,"..\\debug\\xx.lib" )
#else
#pragma comment( lib,"..\\release\\xx.lib" )
#endif

动态方式

进程调用 LoadLibrary(或 AfxLoadLibrary)以显式链接到 DLL

C#调用win32 Dll

参考文章
msdn marshal api
C++ DLL的返回值,安全的做法是分配一个全局 char 数组,把要返回的 char * 复制到这个 char 数组中,

class demoClass
{
[DllImport("demo.dll", EntryPoint = "demo_getVersion", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall)]
private static extern IntPtr demo_getVersion();

[DllImport("demo.dll", EntryPoint = "demo_fun1", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall)]
private static extern IntPtr demo_fun1(string param);


public static string getVersion()
{
IntPtr intPtr = demo_getVersion();
string result = Marshal.PtrToStringUni(intPtr);
return result;
}

public static string merchantScanBarcodePay(string param)
{
IntPtr intPtr = demo_fun1(param);
string result = Marshal.PtrToStringUni(intPtr);
string ss = result;
return ss;
}
}

C++ 接口
wchar_t* __stdcall demo_getVersion();
wchar_t* __stdcall demo_fun1(wchar_t* param);

c# 类型对照