C++ 调用dll函数C++;rad studio xe3

C++ 调用dll函数C++;rad studio xe3,c++,winapi,c++builder,c++builder-xe3,C++,Winapi,C++builder,C++builder Xe3,我尝试从dll调用函数,但它似乎无法正常工作。代码如下: HMODULE dllhandle; #include "Unit1.h" #include <windows.h> #include <iostream.h> #include <conio.h> void __fastcall TForm1::Button1Click(TObject *Sender) { dllhandle = LoadLibrary((wchar_t*)"PBus

我尝试从dll调用函数,但它似乎无法正常工作。代码如下:

HMODULE  dllhandle;
#include "Unit1.h"
#include <windows.h>
#include <iostream.h>  
#include <conio.h>
void __fastcall TForm1::Button1Click(TObject *Sender)
{

    dllhandle = LoadLibrary((wchar_t*)"PBusDrv.dll");

if(dllhandle)
{
typedef int (*PBUSCONNECTEX)(String aux1, String aux2, String ip);
PBUSCONNECTEX PBusConnectEx;

PBusConnectEx =  (PBUSCONNECTEX)GetProcAddress(dllhandle,  "PBusConnectEx");

PBusConnectEx(" "," ","192.168.30.252");
   }
}
hmoduledllhandle;
#包括“Unit1.h”
#包括
#包括
#包括
void\uu fastcall TForm1::Button1Click(TObject*发送方)
{
dllhandle=LoadLibrary((wchar_t*)“PBusDrv.dll”);
if(dllhandle)
{
typedef int(*PBUSCONNECTEX)(字符串aux1、字符串aux2、字符串ip);
PBUSCONNECTEX PBUSCONNECTEX;
PBusConnectEx=(PBusConnectEx)GetProcAddress(dllhandle,“PBusConnectEx”);
PBusConnectEx(“192.168.30.252”);
}
}
dllhandle不断返回空值。

问题可能在这里:

您正在将ANSI字符串(每个字符1个字节)转换为宽字符串(每个字符2个字节)。这是行不通的

您有3种选择:

1-使用ANSI版本的LoadLibrary函数

dllhandle = LoadLibraryA("PBusDrv.dll");
2-根据项目配置使用:

dllhandle = LoadLibrary(_T("PBusDrv.dll"));
3-使用LoadLibrary的宽字符串版本,同时将宽字符串作为输入传递

dllhandle = LoadLibraryW(L"PBusDrv.dll");
注意:不要将非特定函数宏与特定类型的字符串混合使用。例如,不要这样做:

dllhandle = LoadLibrary(L"PBusDrv.dll");
问题可能在这里:

您正在将ANSI字符串(每个字符1个字节)转换为宽字符串(每个字符2个字节)。这是行不通的

您有3种选择:

1-使用ANSI版本的LoadLibrary函数

dllhandle = LoadLibraryA("PBusDrv.dll");
2-根据项目配置使用:

dllhandle = LoadLibrary(_T("PBusDrv.dll"));
3-使用LoadLibrary的宽字符串版本,同时将宽字符串作为输入传递

dllhandle = LoadLibraryW(L"PBusDrv.dll");
注意:不要将非特定函数宏与特定类型的字符串混合使用。例如,不要这样做:

dllhandle = LoadLibrary(L"PBusDrv.dll");

我还可以告诉您,
PBusConnectEx()
没有将
String
对象(在XE3中称为
System::UnicodeString
)作为参数,而是将
char*
参数作为参数,并使用
\uu stdcall
调用约定。因此,您还需要修复
PBUSCONNECTEX
声明:
typedef int(u stdcall*PBUSCONNECTEX)(char*aux1,char*aux2,char*ip)它可以工作,但现在dll函数似乎可以nothing@Alejandra你想让我们调试你的整个程序吗?这似乎不公平。尤其是在缺乏信息的情况下。这就是你所问问题的答案。请接受它。不期待你调试整个程序,只是有一些疑问。。。。答案很好。。。。嗯,谢谢@yms!!!我还可以告诉您,
PBusConnectEx()
没有将
String
对象(在XE3中称为
System::UnicodeString
)作为参数,而是将
char*
参数作为参数,并使用
\uu stdcall
调用约定。因此,您还需要修复
PBUSCONNECTEX
声明:
typedef int(u stdcall*PBUSCONNECTEX)(char*aux1,char*aux2,char*ip)它可以工作,但现在dll函数似乎可以nothing@Alejandra你想让我们调试你的整个程序吗?这似乎不公平。尤其是在缺乏信息的情况下。这就是你所问问题的答案。请接受它。不期待你调试整个程序,只是有一些疑问。。。。答案很好。。。。嗯,谢谢@yms!!!加载库(L“PBusDrv.dll”);你对编译器撒了谎,你收获了这个谎的正当后果。@Chris:那也是个谎,尽管编译器能抓住。它要么是
LoadLibraryA(“PBusDrv.dll”)
加载库w(L“PBusDrv.dll”)(或者
LoadLibrary(_T(“PBusDrv.dll”);
-但这在2015年已经不再有用了;你对编译器撒了谎,你收获了这个谎的正当后果。@Chris:那也是个谎,尽管编译器能抓住。它要么是
LoadLibraryA(“PBusDrv.dll”)
加载库w(L“PBusDrv.dll”)(或者
LoadLibrary(_T(“PBusDrv.dll”);
——但这在2015年已经不再有用了)。