描述:
(1)
我写了一个dll,我能否在通过调用dll中的函数设置dll中的数据
例:
//test.cpp
#include "stdafx.h"
int m = 100;//需要在调用dll时设置的数据
//声明
extern "C" __declspec(dllexport) void __stdcall SetData(int w);
extern "C" __declspec(dllexport) int __stdcall GetData();
//下面这个两个函数在vb中如何调用
extern "C" __declspec(dllexport) void __stdcall testp(unsigned char *pData);
extern "C" __declspec(dllexport) void __stdcall testpp(unsigned char **ppData);
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch( ul_reason_for_call )
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
//调用这个函数来设置m,测试过好象不行,不知道为什么
void __stdcall SetData(int w)
{
m = w;
}
int __stdcall GetData()
{
return m;
}
(2)
还有下面两个函数在vb中如何调用,关键是参数类型是指针或指向指针的批针的调用
void __stdcall testp(unsigned char *pData)
{
}
void __stdcall testpp(unsigned char **ppData)
{
}
解决方案1:
函数声明如下:
extern "C" void __stdcall SetData(int w);
extern "C" int __stdcall GetData();
extern "C" void __stdcall testp(unsigned char *pData,int cb);//cb为传入的数组元素个数
extern "C" void __stdcall testpp(unsigned char **ppData,int cb);//cb为传入的数组元素个数
加入.def文件,导出以上函数
LIBRARY "demoDll"
DESCRIPTION "demoDll labrary"
EXPORTS
SetData @1
GetData @2
testp @3
testpp @4
在VB中如下生明函数:
Private Declare Sub SetData Lib "D:\VC_PROJECT\demoDll\demoDll" (ByVal w As Integer)
Private Declare Function GetData Lib "D:\VC_PROJECT\demoDll\demoDll" () As Integer
Private Declare Sub testp Lib "D:\VC_PROJECT\demoDll\demoDll" (b As Any,byval cb as integer)
Private Declare Sub testpp Lib "D:\VC_PROJECT\demoDll\demoDll" (bb As Any,byval cb as integer)
声明中我的 dll放在D:\VC_PROJECT\demoDll\demoDll路径下,如果把dll 放在你的可执行路径下可不指定路径.
在VB中使用如下:
dim b(2) as byte
b(0)=100
b(1)=200
b(2)=250
testp b(0)'传入数组的第一个元素
''''''''''''''''''''''''''''''''''
Dim bb(1, 1) As Byte
bb(0, 0) = 100
bb(0, 1) = 200
bb(1, 0) = 20
bb(1, 1) = 50
testpp bb(0, 0)//传入二维数组的第一个元素
2d指针只能通过Safearray调用,二进制指针建议通过文件作为中间媒介来通讯,
简单易用,童叟无期,当然用safearraya也是可以的,其他的数据结构
参见vb,vc参数传递问题
第1个问题,如果你想在A进程中改变m的值,然后在B进程中查看结果的话,那么需要使用共享段:
#pragma data_seg("shared")
int m = 100;//需要在调用dll时设置的数据
#pragma data_seg()
#pragma comment(linker, "/section:shared,rws")