当前位置: 代码迷 >> Delphi >> winfrom调用delphi写的dll,该怎么解决
  详细解决方案

winfrom调用delphi写的dll,该怎么解决

热度:5111   发布时间:2013-02-25 00:00:00.0
winfrom调用delphi写的dll
有delphi写的一个dll,dll中有个com控件。
问题是我现在引用了在winfrom中报错,错误信息:无法在dll中找到"ConnectReq"入口点

C# code
        [DllImport("SPCUserInterface.dll", EntryPoint = "ConnectReq", SetLastError = true, CharSet = CharSet.Ansi,            CallingConvention = CallingConvention.StdCall, ExactSpelling = true)]        public static extern bool connectReq();


文档中有方法:

方法名: ConnectReq
参数: 无
返回值: VARIANT_BOOL
  True:成功
  False:失败

------解决方案--------------------------------------------------------
DLL 入口点
在创建 DLL 时,可以有选择地指定入口点函数。当进程或线程将它们自身附加到 DLL 或者将它们自身从 DLL 分离时,将调用入口点函数。您可以使用入口点函数根据 DLL 的需要来初始化数据结构或者销毁数据结构。此外,如果应用程序是多线程的,则可以在入口点函数中使用线程本地存储 (TLS) 来分配各个线程专用的内存。下面的代码是一个 DLL 入口点函数的示例。

BOOL APIENTRY DllMain(
HANDLE hModule, // Handle to DLL module
 DWORD ul_reason_for_call, // Reason for calling function
 LPVOID lpReserved ) // Reserved
{
 switch ( ul_reason_for_call )
 {
case DLL_PROCESS_ATTACHED:
// A process is loading the DLL.
break;
case DLL_THREAD_ATTACHED:
// A process is creating a new thread.
break;
case DLL_THREAD_DETACH:
// A thread exits normally.
break;
case DLL_PROCESS_DETACH:
// A process unloads the DLL.
break;
 }
 return TRUE;
}

当入口点函数返回 FALSE 值时,如果您使用的是加载时动态链接,则应用程序不启动。如果您使用的是运行时动态链接,则只有个别 DLL 不会加载。

入口点函数只应执行简单的初始化任务,不应调用任何其他 DLL 加载函数或终止函数。例如,在入口点函数中,不应直接或间接调用 LoadLibrary 函数或 LoadLibraryEx 函数。此外,不应在进程终止时调用 FreeLibrary 函数。

注意:在多线程应用程序中,请确保将对 DLL 全局数据的访问进行同步(线程安全),以避免可能的数据损坏。为此,请使用 TLS 为各个线程提供唯一的数据
------解决方案--------------------------------------------------------
因为你的 ExactSpelling= true,所以我怀疑是ConnectReq这个名字的拼写有错误或大小写不一致

找个查看 dll的工具,看看是不是大小写有问题
------解决方案--------------------------------------------------------
COM不能使用DllImport调用
要注册COM后引用再调用
  相关解决方案