有一个代码:
var
myobject: OleVariant;
begin
myobject := CreateOleObject('SomeNamespace.SomeClass');
end;
Run Code Online (Sandbox Code Playgroud)
此COM对象具有事件(例如OnClick).如何在不导入TLB的情况下连接这些事件?
这段代码:
public class PMTest
{
private static class Runner { }
private static class Server extends Runner { }
private static class Task
{
public void delegate(Runner runner)
{
System.out.println("Task: " + runner.getClass().getName() +
" / " + this.getClass().getName());
}
}
private static class Action extends Task
{
public void delegate(Server server)
{
System.out.println("Action: " + server.getClass().getName() +
" / " + this.getClass().getName());
}
}
private static void foo(Task task, Runner runner)
{
task.delegate(runner);
}
private static void bar(Action task, …Run Code Online (Sandbox Code Playgroud) 我喜欢在我的VBA项目中使用早期绑定,因为我喜欢在开发过程中自动完成方法名称等.我也很有信心知道编译器会在我拼写错误的方法名称时发出警告.
但是,要使用早期绑定,我需要添加对相关库的引用(例如,"Microsoft Scripting Runtime").这对于那样的"标准"库来说很好,但有时我想使用可能存在或不存在于用户机器上的库.
理想情况下,如果库不存在(例如"xyz未安装在此计算机上,因此无法使用此功能"),我希望显示有用的消息.如果我只使用后期绑定,那么我可以这样做:
Dim o As Object
Set o = CreateObject("foo", "bar")
If o Is Nothing Then
MsgBox "nope"
End If
Run Code Online (Sandbox Code Playgroud)
但是,如果我添加了对库的引用以便使用早期绑定,那么如果库不存在,则在加载VBA项目时会出现编译错误.因此,没有代码运行(包括检测库不存在的代码).
围绕这个捕获22有什么办法吗?
我试图将此代码转换为C#.NET Framework 3.5,但该版本不是后期绑定友好.如果我使用4.0,我会使用动态类型,但现在不是一个选项.
使事情变得复杂的是我真正想要创建的对象(atl3270Tool)是在参数内创建的.帮助将不胜感激.
Dim atl3270Tool
Dim ErrMsg As String
Dim S_OK As UInt16 = 0
Dim atlDirectorObject = CreateObject("atlDirectorObject.atlDirector")
If atlDirectorObject.CreateTool("3270", 1, True, True, 0, atl3270Tool, ErrMsg) <> S_OK Then
'Terminate
End If
Run Code Online (Sandbox Code Playgroud) 使用winforms,C#FW4.5使用后期绑定打开excel工作表,如下所示:
objExcel = CreateObject("Excel.Application")
Run Code Online (Sandbox Code Playgroud)
现在我想使用该InvokeMember方法,但是我不知道我可以调用的所有excel成员。例如,我知道我可以这样称呼它:InvokeMember("Close",...为了关闭excel,但是在哪里可以找到我可以调用的所有成员的列表以及每个成员的作用呢?
我有这个小功能,可以通过VBA实现电子邮件的创建,
它从另一个与Excel文件一起工作的函数中获取数据.
我遇到的问题是我通过Excel 2016完成了这一切,当我的一些同事试图使用它时,错误的引用(Outlook Library 16.0).
所以我查看了互联网解决方案,我找到的解决方案很多,但更好的是Late Binding.我已经阅读了所有相关内容,但我似乎并不真正了解正在发生的事情以及如何使其在以下代码中运行.
Sub EscalateCase(what_address As String, subject_line As String, email_body As String)
Dim olApp As Outlook.Application
Set olApp = CreateObject("Outlook.Application")
Dim olMail As Outlook.MailItem
Set olMail = olApp.CreateItem(olMailItem)
olMail.To = what_address
olMail.Subject = subject_line
olMail.BodyFormat = olFormatHTML
olMail.HTMLBody = email_body
olMail.Send
End Sub
Run Code Online (Sandbox Code Playgroud)
因此,也许你可以帮我解决这个例子,以便看到我的这个实际案例.
我有一个C#项目,它构建成一个DLL,有两个类,ClassA和ClassB.出于项目管理的原因,我想将ClassB移动到一个单独的DLL中,只保留原始DLL与ClassA.
问题是我有其他DLL(也是从C#编译)在其原始DLL中引用ClassA和ClassB.ClassA很好但是调用ClassB最终会产生TypeLoadException.
(我可以使用他们的新项目引用重新编译所有其他DLL,但出于项目管理的原因,我宁愿不这样做.)
有没有办法我可以部署我的新拆分DLL并让其他DLL继续工作?或者,我是否真的需要咬住众所周知的子弹并计划部署所有这些文件的新版本?
如果二维数组是浮点类型,我想调用第一个函数,否则调用第二个函数,我该如何实现?
void printff(int n,float m[n][n])
{
for(int i=0;i<n;i++){
for(int j=0;j<n;j++)
printf("\t%f",m[i][j]);
printf("\n");
}
}
void printfi(int n,int m[n][n])
{
for(int i=0;i<n;i++){
for(int j=0;j<n;j++)
printf("\t%d",m[i][j]);
printf("\n");
}
}
#define print(a,b) _Generic(b,int*[sizeof(a)]:printfi,float*[sizeof(a)]:printff)(a,b)
Run Code Online (Sandbox Code Playgroud) 我必须进行反思和后期绑定,所以我不知道是否有办法加快速度。以为我会试一试。
这个片段大约需要 15 秒才能完成,这太慢了,但看看我需要如何读取元数据。
private static object InvokeCall(Type HostObjectType, Object HostObject, CallType callType, string PropertyOrMethodName, object[] args)
{
if (callType == CallType.Method)
{
return MyObjectType.InvokeMember(PropertyOrMethodName,System.Reflection.BindingFlags.InvokeMethod, null, myObject, args);
}
}
Run Code Online (Sandbox Code Playgroud) 注意: 我在问是否有一种 Pythonic 的方式来做到这一点(使用默认参数似乎比使用部分 Pythonic 更少),并且是否有任何一种方法的重大限制(“成本” - 我不希望时间有显着差异,但是也许还有其他限制我没有看到使平衡倾向于一种方法与另一种方法)。
我试图了解在 lambda 不可行的后期绑定情况下使用“部分”的成本。我已经根据本指南创建了一些示例代码来说明这一点。
由于后期绑定,以下内容无法按预期工作:
def create_thingies():
thingies = []
for i in range(1,6):
def thingy(x):
print("Some output", i)
return i ** (x * i)
thingies.append(thingy)
return thingies
results=[]
for thingy in create_thingies():
results.append(thingy(2))
print(results)
Run Code Online (Sandbox Code Playgroud)
输出:
Some output 5
Some output 5
Some output 5
Some output 5
Some output 5
[9765625, 9765625, 9765625, 9765625, 9765625]
Run Code Online (Sandbox Code Playgroud)
使用“部分”我们可以避免这个问题,但代价是什么?
from functools import partial
def create_thingies():
thingies = []
for i in range(1,6):
def …Run Code Online (Sandbox Code Playgroud)