我有一个dll(在Delphi中创建),其中包含一个继承自TForm的TGlobalForm
我想在我的项目(Delphi Project)中使用TGlobalForm并从TGlobalForm继承一些表单.
示例TAccountsForm = class(TGlobalForm)
问题是我不想在项目的使用中使用GlobalForm pas文件,我希望它就像你创建一个新表单(File-> New-> Other)并选择(可继承的项目) )在(Delphi Projects)节点下,所以新创建的表单将显示继承表单的项目(按钮,编辑...)(TGlobalForm)
怎么做到这一点?
我正在使用Delphi XE3 - VCL Project
谢谢.
我有以下程序:
procedure MyMainThread.MapProc;
var
Handle: THandle;
PID: dword;
Struct: TProcessEntry32;
Processes: TStringList;
begin
Handle:= CreateToolHelp32SnapShot(TH32CS_SNAPPROCESS, 0);
Struct.dwSize:=Sizeof(TProcessEntry32);
Process32First(Handle, Struct);
Processes:= TStringList.Create;
repeat
Processes.Add(Struct.szExeFile);
Processes.SaveToFile('C:\Log.txt');
PID:= Struct.th32ProcessID;
PIDHandle:= OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_OPERATION or
PROCESS_VM_READ, false, PID);
CloseHandle(PIDHandle);
until (not Process32Next(Handle,Struct));
Processes.Free;
end;
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,我将运行的进程保存在C:\ Log.txt中,这在.exe文件中很有用.现在我正在尝试在.DLL文件中实现它,概念是:DLL将被加载,它将有一个EntryPoint调用Thread.Create ...这个Thread将使用SetTimer来运行MapProc的过程每10秒钟在C:\ Log.txt中保存正在运行的进程.代码是:
library Project1;
uses
Windows,
SysUtils,
Classes,
Registry,
EncdDecd,
TLHelp32,
IdHTTP;
{$R *.res}
type
MyMainThread = Class(TThread)
var
DestDir, ContactHost: String;
Sent: TStringList;
PIDHandle: THandle; //need to be public because we use in MapProc / CatchYa
private …Run Code Online (Sandbox Code Playgroud) 它是为了什么?
为什么他们的各种版本呢?什么是可用的版本以及它们各自匹配的内容?
为什么它似乎导致许可证问题?EG:我有些像py2exe这样的工具无法捆绑它们但是你仍然需要它们来运行生成的exe.
如果要为Windows分发软件,如何解决这个问题:
我正在尝试为Windows平台制作独立的应用程序.我搜索了我的应用程序所依赖的dll,将它们放在exe上,并且工作正常.
最近,在我的一个应用程序中,我看到所询问的依赖关系有点不同:
和一些更类似的..
常见的是,所有这些新的依赖项都是相同的旧依赖项,并附加了一个d.当我使用带有'd'的新的时,我的应用程序运行正常.问题是所有这些带有'd'的dll的大小几乎都比正常的db大100Mb.
例如:
Qt5Guid.dll~119 Mb
Qt5Gui.dll~4 Mb
这使我的包大小变大,可以作为一个应用程序.
Q1.普通dll和带有d后缀的对应物之间有什么区别.?
Q2.我可以做些什么来使我的应用程序明确依赖于正常的应用程序,因此我的应用程序的大小更小?
我们计划保护我们的应用程序,以便其他程序员无法反编译.我知道有些工具可以像JetBrains dotPeek那样反编译一个dll和exe.是否有可以实现这一目标的工具或程序.
我.DLL使用其中的一些实用程序函数创建了"命名"共享内存
我需要struct使用具有以下原型的函数通过python 写入/读取C :
int write_shmem(const char* shmem_name, char* shmem) int read_shmem ( const char* shmem_name , char* shmem);在.DLL文件中
shmem_name 是共享内存名称shmem 是要写的数据C struct类似于
typedef struct {
unsigned char c;
unsigned long l;
float f;
double d;
} DataBlock ;
Run Code Online (Sandbox Code Playgroud)
我在python代码中使用以下
from ctypes import *
dll = cdll.LoadLibrary('shared_mem.dll')
write_shmem = dll.write_shmem
write_shmem.restype = ctypes.c_int
read_shmem = dll.read_shmem
read_shmem.restype = ctypes.c_int
class DataBlock(Structure):
_fields_ = [('c', c_ubyte), ('l', c_ulong),
('f',c_float), ('d', c_double) …Run Code Online (Sandbox Code Playgroud) 我已经创建了一个DLL文件,在头文件中我看到:
#ifdef WIN32DLL_EXPORTS
Run Code Online (Sandbox Code Playgroud)
我不明白它是什么意思,我们在哪里/如何设置WIN32DLL_EXPORTS.
如果我使用:
#ifdef WIN32DLL_EXPORTS
#define WIN32DLL_API __declspec(dllexport)
#else
#define WIN32DLL_API __declspec(dllimport)
#endif
WIN32DLL_API int testSum(void);
Run Code Online (Sandbox Code Playgroud)
testSum被认为是__declspec(dllimport).所以我认为我的项目没有设定WIN32DLL_EXPORTS?我怎么能改变这个?
我们正在尝试使用LoadLibraryA函数从64位dll中加载一个dll库.它返回126错误 - 未找到mod.给我们的函数的dll文件路径是正确的,我们确定.
我们已经尝试了一个虚拟dll进行测试并且它有效,它已加载.
我们还尝试将dll(这是我们想要加载的第一个dll的依赖性)添加到虚拟dll.它也有效.所以问题似乎不是关于依赖dll,而是我们想要首先加载的原始dll.
我们也尝试将dl转换为64位,并尝试了,仍然没有好处.
我们还使用Dependency Walker检查了依赖关系.一切都好.
我们使用的操作系统是Windows 8,64bit.如果它有任何区别..有没有人对这个问题有任何想法?
编辑:我们也试过这段代码:
hModule = LoadLibraryW(L"C:\\temp\\dllToLoad.dll");
Run Code Online (Sandbox Code Playgroud)
并收到此错误代码:
"First-chance exception at 0x00000000 in C_Test_TSMPPKCS11.exe: 0xC0000005: Access violation at location 0x0000000000000000."
Run Code Online (Sandbox Code Playgroud)
编辑2:我们首先使用的代码是:
hModule = LoadLibraryA((char*)aDLLFile);
Run Code Online (Sandbox Code Playgroud)
编辑3:我们使用完整路径加载DLL.为了测试这个,我们尝试了这段代码:
FILE *fp;
int size = 0;
fp=fopen("C:\\temp\\dllToLoad.dll", "r");
size = fgetc(fp);
printf("size:%d\n",size);
fclose(fp);
Run Code Online (Sandbox Code Playgroud)
没问题,我们收到的文件大小是77.
我为Control DLL创建了一个DLL加载器(这些控件具有相同的接口iControlPlugin),一切都很好用.但是我现在需要为设备驱动程序创建一个DLL加载器.我开始查看我的Control Loader代码,并意识到代码是相同的,除非定义了接口类型.因此,我想使我的控制加载器功能更通用,以便它可以用于不同的接口类型.
我修改了函数,以便它返回一个字典,我遇到的问题是我做了一个检查,以确保DLL文件包含匹配的类型,在我的情况下,这是两种接口类型之一.但我总是无效.
这是我原来的工作功能,专门针对一种类型(iLPPControlPlugin)
public Dictionary<string, iLPPControlPlugin> LoadPlugins(string folder)
{
/* Create a Dictionary object to store the loaded DLL's */
Dictionary<string, iLPPControlPlugin> plugsins = new Dictionary<string,iLPPControlPlugin>();
/* Get all the DLL files from the path specified */
string[] files = Directory.GetFiles(folder, "*.dll");
/* Go through each DLL... */
foreach (string file in files)
{
/* Load the file, as an assembly. */
Assembly assembly = Assembly.LoadFile(file);
/* Get the type, can be more than one */
var types …Run Code Online (Sandbox Code Playgroud) 我们在Visual Studio中创建了一个C#项目,结果是一个DLL文件.如果我们将该DLL文件导入第三方应用程序,它将充当插件.一切都好.但我的DLL文件中有一个错误,我可以通过放置一个调试点找到它.但我不知道如何为导入第三方应用程序的DLL执行此操作.